簡體   English   中英

如何將一個字符數組的某些位轉換為C中的另一個字符數組?

[英]How to get certain bits of a char array to another char array in C?

我有一個大小為60的char(輸入)數組。我想編寫一個返回輸入數組某些位的函數。

char  input_ar[60];

char output_ar[60];

void func(int bits_starting_number, int total_number_bits){

}

int main()
{

input_ar[0]=0b11110001; 

input_ar[1]=0b00110011; 

func(3,11);

//want output_ar[0]=0b11000100; //least significant 6 bits of input_ar[0] and most significant bits (7.8.) of input_ar[1]

//want output_ar[1]=0b00000110; //6.5.4. bits of input_ar[1] corresponds to 3 2 1. bits of  output_ar[1] (110)  right-aligned other bits are 0, namely 8 7 ...4 bits is zero


}

我想問一下該算法的術語是什么? 如何輕松編寫代碼? 有任何線索。

注意:我使用XC8,不允許使用arrray。

首先,返回類型:您可以返回長度為total_number_bits的布爾數組。

在函數內部,您可以執行一個forloop,從bits_starting_number開始,迭代total_number_bits次。 對於每個數字,你可以將forloopindex除以8(得到正確的char),然后用forloopindex modulo 8將1換成1,得到正確的位。 把它放在輸出數組中的正確位置(forloopindex - bits_starting_number)你很高興去

這將變為:

for(i = bits_starting_number; i < bits_starting_number + total_number_bits; i++) {
    boolarr[i - bits_starting_number] = charray[i/8] & (1 << (i % 8));
}

該答案做出以下假設。 位從1開始編號,第一位是第一個字節的MS位。 提取的位數組必須左對齊。 右邊的未使用位填充為0。

#include <stdio.h>
#include <string.h>
#include <limits.h>

#define MAX_LEN 60
#define BMASK   (1 << (CHAR_BIT-1))

unsigned char  input_ar[MAX_LEN];
unsigned char output_ar[MAX_LEN];

int func(int bits_starting_number, int total_number_bits) {
    // return the number of bits copied
    int sors_ind, sors_bit, dest_ind = 0;
    int i, imask, omask;
    memset (output_ar, 0, MAX_LEN);         // clear the result
    if (bits_starting_number < 1 || bits_starting_number > MAX_LEN * CHAR_BIT)
        return 0;                           // bit number is out of range
    if (total_number_bits < 1)
        return 0;                           // nothing to do
    bits_starting_number--;
    if (bits_starting_number + total_number_bits > MAX_LEN * CHAR_BIT)
        total_number_bits = MAX_LEN * CHAR_BIT - bits_starting_number;
    sors_ind = bits_starting_number / CHAR_BIT;
    sors_bit = CHAR_BIT - 1 - (bits_starting_number % CHAR_BIT);
    imask = 1 << sors_bit;
    omask = BMASK;
    for (i=0; i<total_number_bits; i++) {
        if (input_ar[sors_ind] & imask)
            output_ar[dest_ind] |= omask;   // copy a 1 bit
        if ((imask >>= 1) == 0) {           // shift the input mask
            imask = BMASK;
            sors_ind++;                     // next input byte
        }
        if ((omask >>= 1) == 0) {           // shift the output mask
            omask = BMASK;
            dest_ind++;                     // next output byte
        }
    }
    return total_number_bits;
}

void printb (int value) {
    int i;
    for (i=BMASK; i; i>>=1) {
        if (value & i)
            printf("1");
        else
            printf("0");
    }
    printf (" ");
}

int main(void) {
    int i;
    input_ar[0]= 0xF1;  // 0b11110001
    input_ar[1]= 0x33;  // 0b00110011 

    printf ("Input:  ");
    for (i=0; i<4; i++)
       printb(input_ar[i]);
    printf ("\n");

    func(3,11);

    printf ("Output: ");
    for (i=0; i<4; i++)
       printb(output_ar[i]);
    printf ("\n");
    return 0;
}

程序輸出

Input:  11110001 00110011 00000000 00000000
Output: 11000100 11000000 00000000 00000000

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM