gpt4 book ai didi

c - 如何在 C 中将一个 char 数组的某些位获取到另一个 char 数组?

转载 作者:行者123 更新时间:2023-11-30 17:20:42 25 4
gpt4 key购买 nike

我有一个大小为 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,不允许使用位数组。

最佳答案

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

关于c - 如何在 C 中将一个 char 数组的某些位获取到另一个 char 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28475911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com