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