C / C ++按位运算未产生预期的输出?

时间:2019-03-07 18:27:19

标签: c++ c bit-manipulation bitwise-operators bit-shift

我目前正在从事按位运算,但是现在我很困惑...这是独家新闻,为什么

我有一个字节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的数字,例如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);

1 个答案:

答案 0 :(得分:2)

  

我尝试处理位偏移的方式是否有误?

似乎有。

  

如果是,我做错了什么?

尚不清楚,因此我提供了一个合理的完整解释。

首先,必须了解C不会直接对小于int的整数执行任何算术运算,这一点很重要。然后,考虑您的表达式byte_now << bit_pos。对操作数执行“通常的算术提升”,导致左操作数被转换为int0xCD。结果具有与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。