我目前正致力于按位操作,但我现在很困惑......这是独家新闻和原因
我有一个字节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的数字,比如205 0.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);
关于我试图在脑海中处理位移的方式有什么不对吗?
似乎有。
如果是这样,我做错了什么?
目前还不清楚,所以我提供了一个相当充分的解释。
首先,重要的是要理解C不会直接对小于int
的整数执行任何算术。那么,考虑你的表达byte_now << bit_pos
。对操作数执行“通常的算术促销”,导致左操作数被转换为int
值0xCD
。结果与bit_flag
具有相同的最低有效位模式,但也有一堆前导零位。
将结果左移7位产生位模式110 0110 1000 0000
,相当于0x6680
。然后,对结果执行按位和运算,屏蔽除最不重要的8位之外的所有值,从而产生0x80
。将该值分配给bit_flag
时会发生什么情况取决于该变量的类型,但如果它是一个无符号或超过7个值位的整数类型,那么赋值是明确定义的并且保持值。请注意,第7位是非零,而不是第0位。
当你把它传递到bit_flag
时,printf()
的类型更重要。你已经将它与%d
字段描述符配对,如果bit_flag
的类型为int
,则该指令是正确的,否则不正确。如果bit_flag
确实有类型int
,那么我希望该程序打印128。