C/C++ 按位运算没有产生预期的输出?
C/C++ Bitwise Operations not resulting in expected output?
我目前正在研究按位运算,但我现在很困惑...这是独家新闻和原因
我有一个字节 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);
Is there something incorrect about the way I am trying to process bit shifting in my head?
好像有。
If so what is it that I am doing wrong?
这还不清楚,所以我提供了一个相当完整的解释。
首先,重要的是要了解 C 不会直接对小于 int
的整数执行任何算术运算。那么,请考虑您的表达式 byte_now << bit_pos
。 "The usual arithmetic promotions" 对操作数执行,导致左操作数被转换为 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.
我目前正在研究按位运算,但我现在很困惑...这是独家新闻和原因
我有一个字节 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);
Is there something incorrect about the way I am trying to process bit shifting in my head?
好像有。
If so what is it that I am doing wrong?
这还不清楚,所以我提供了一个相当完整的解释。
首先,重要的是要了解 C 不会直接对小于 int
的整数执行任何算术运算。那么,请考虑您的表达式 byte_now << bit_pos
。 "The usual arithmetic promotions" 对操作数执行,导致左操作数被转换为 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.