我目前正在从事按位运算,但是现在我很困惑...这是独家新闻,为什么
我有一个字节0xCD
,位为1100 1101
我将位左移7,所以我说& 0xFF
是因为0xFF
的位数是1111 1111
unsigned int bit = (0xCD << 7) & 0xFF<<7;
现在,我假设0xCD
和0xFF
都将向左移7次,剩余的位将是1&1 = 1
,但我没有得到输出另外我还要假设移位6会给我0&1 = 0
位,但是我又得到了一个大于1的数字,例如2050。o我尝试处理位移位的方式是否有误?头?如果是这样,那我做错了什么?
下面的代码:
unsigned char byte_now = 0xCD;
printf("Bits for byte_now: 0x%02x: ", byte_now);
/*
* We want to get the first bit in a byte.
* To do this we will shift the bits over 7 places for the last bit
* we will compare it to 0xFF since it's (1111 1111) if bit&1 then the bit is one
*/
unsigned int bit_flag = 0;
int bit_pos = 7;
bit_flag = (byte_now << bit_pos) & 0xFF;
printf("%d", bit_flag);
答案 0 :(得分:2)
我尝试处理位偏移的方式是否有误?
似乎有。
如果是,我做错了什么?
尚不清楚,因此我提供了一个合理的完整解释。
首先,必须了解C不会直接对小于int
的整数执行任何算术运算,这一点很重要。然后,考虑您的表达式byte_now << bit_pos
。对操作数执行“通常的算术提升”,导致左操作数被转换为int
值0xCD
。结果具有与bit_flag
相同的最小有效值位模式,但还有一堆前导零位。
将结果左移7位将产生与110 0110 1000 0000
等效的位模式0x6680
。然后,对结果执行按位运算,并屏蔽除最低有效8位之外的所有8位,从而产生0x80
。将其分配给bit_flag
时会发生什么情况,取决于该变量的类型,但是如果它是一个无符号或具有7个以上值位的整数类型,则分配是定义明确的并保留值。请注意, 7 位不是零,而不是0位。
将bit_flag
的类型传递给printf()
时,其类型更为重要。您已将其与%d
字段描述符配对,如果bit_flag
的类型为int
则正确,否则为错误。如果bit_flag
确实的类型为int
,那么我希望程序可以打印128。