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

问题描述 投票:-1回答:1

我目前正致力于按位操作,但我现在很困惑......这是独家新闻和原因

我有一个字节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);
c++ c bit-manipulation bitwise-operators bit-shift
1个回答
2
投票

关于我试图在脑海中处理位移的方式有什么不对吗?

似乎有。

如果是这样,我做错了什么?

目前还不清楚,所以我提供了一个相当充分的解释。

首先,重要的是要理解C不会直接对小于int的整数执行任何算术。那么,考虑你的表达byte_now << bit_pos。对操作数执行“通常的算术促销”,导致左操作数被转换为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。

© www.soinside.com 2019 - 2024. All rights reserved.