作为更大问题的一部分,我必须采用一些二进制值:00000000 11011110 (8)
然后,我必须:
- 导出此函数中的位数 - 因此我通过找到最大 sig 数字的位置来完成此操作。
- 然后将该值的前 6 个数字存储到值 128 中,使其等于:10011110
- 然后将该值的最后 5 个数字存储到值 192 中,使其等于:11000011 10011110
- 这两个字节应该存储在某个数组中,buffer[]
我已经编写了这个函数,但是,位置似乎没有在 gdb 中正确初始化,并且值没有正确输出。这是我的尝试:
void create_value(unsigned short init_val, unsigned char buffer[])
{
// get the count
int position = 0;
while (init_val >>= 1)
position++;
// get total
int count = position++;
int start = 128;
for (int i = 0; i < 7; i++)
if (((1 << i) & init_val) != 0) start = start | 1 << i;
buffer[0] = start;
start = 192;
for (int i = 7; i < 11; i++) {
if (((1 << i) & init_val) !=0) start = start | 1 << i;
}
buf[1] = start;
}
最佳答案
之后
while (init_val >>= 1)
position++;
init_val
将为 0
。当您以后使用时
if (((1 << i) & init_val) != 0) start = start | 1 << i;
你永远不会改变开始
。
所以,在阅读完您尝试要做的事情(描述得很困惑)后,为什么不:
void create_value(unsigned short init_value, unsigned char buffer[])
{
buffer[0] = (init_value & 63) | 128;
buffer[1] = ((init_value >> 6) & 31) | 192;
return;
}
它的作用:init_value & 63
根据需要屏蔽 init_value 中除最低 6 位之外的所有位。 | 128
然后设置字节的最高有效位(请注意,IFF CHAR_BIT == 8)。
(init_value >> 6)
将 init_value 下移 6 位,因此现在原始位 6-11 变为位 0-4。 & 31
屏蔽该值中最低 5 位的所有位,| 192
设置两个最高有效位。
关于c - 分解位模式、移位并创建新模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24871096/