gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:45:21 25 4
gpt4 key购买 nike

我目前正在研究按位运算,但我现在很困惑......这是独家新闻和原因

我有一个字节0xCD(以位为单位),这是1100 1101我将位左移 7,然后我说 & 0xFF 因为 0xFF 位为 1111 1111

unsigned int bit = (0xCD << 7) & 0xFF<<7;

现在我假设 0xCD0xFF 都会向左移位 7 次,剩余位将为 1&1 = 1 code> 但我没有得到输出,我也会假设移位 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 。对操作数执行“通常的算术提升”,导致左操作数转换为 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。

关于c++ - C/C++ 按位运算未产生预期输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55050518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com