手动添加位掩码与添加按位移位

时间:2019-09-04 04:02:30

标签: c bitwise-operators

我正在尝试添加一个左运算符以替换以下内容:

unsigned long bitmask = 0b10000000000000000000000000000000;
printf("%lu\n", bitmask);

unsigned long bitmask2 = (1 << 31)-1;
printf("%lu\n", bitmask2);

但是,我能得到的最接近的是-1。如果我尝试执行(1 << 31),则好像出现溢出或其他错误。正确的方法是什么?

# in the python shell
>>> 0b10000000000000000000000000000000
2147483648

>>> 1<<31
2147483648

>>> 0b10000000000000000000000000000000 == 1<<31
True

3 个答案:

答案 0 :(得分:3)

由于移位结果的类型为unsigned long,因此应以无符号长常量开头:

unsigned long bitmask2 = (1UL << 31) - 1;

答案 1 :(得分:1)

更改

unsigned long bitmask2 = (1 << 31)-1;

类似

unsigned long bitmask2 = (1UL << 31);

代替

溢出是由于您将1的31个位按位移位而超出了有符号的int的边界。请注意,1是带符号的int文字。

答案 2 :(得分:-1)

所有整数常量,例如1都有一个类型,在这种情况下为intint是带符号的,因此具有31个数据位和1个符号位。您不能将数据移入该符号位-1<<31是一个严重的未定义行为错误。

根据经验,切勿将带符号的操作数与按位运算符混合。您可以通过在整数常量1u << 31上添加'u'后缀来修复该错误。现在,类型是unsigned int,而是32个数据位。

请注意,移位操作的结果类型是 left 操作数的类型。因此,无需编写例如1u << 31u