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;

现在我假设 0xCD0xFF 都会向左移动 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" 对操作数执行,导致左操作数被转换为 int0xCD。结果具有与 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.