如何将char数组的某些位转换为C中的另一个char数组?

时间:2015-02-12 11:09:28

标签: c arrays bit-manipulation

我有一个大小为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。

2 个答案:

答案 0 :(得分:0)

首先,returnsntype:你可以返回一个长度为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 :(得分:0)

这个答案做出以下假设。位从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