比较不同大小的位域

时间:2011-06-09 16:46:57

标签: c++ bit-manipulation low-level bit-fields

如果使用按位运算符(&|等)来比较不同大小的两个位域,会发生什么?

例如,将0 1 1 00 0 1 0 0 0 0 1进行比较:

0 1 1 0 0 0 0 0 The smaller one is extended with zeros and pushed to the
0 0 1 0 0 0 0 1 most-significant side.

或者...

0 0 0 0 0 1 1 0 The smaller one is extended with zeros and pushed to the
0 0 1 0 0 0 0 1 least-significant side.

或者...

0 1 1 0 The longer one is truncated from its least-significant side,
0 0 1 0 keeping its most significant side.

或者...

0 1 1 0 The longer one is truncated from its most-significant side,
0 0 0 1 keeping its least-significant side.

3 个答案:

答案 0 :(得分:7)

按位运算符始终用于提升的操作数。所以可能发生的事情可能取决于是否有一个(或两个)位域被签名(因为这可能导致符号扩展)。

因此,对于您的示例值,具有二进制值0 1 1 0的位字段将被提升为int 6,并且具有二进制值{{1}的位字段1}}将被提升为0 0 1 0 0 0 0 1 int,这些操作数将用于任何操作。

答案 1 :(得分:2)

如果您实际上将这些值用作位域,那么比较不同大小的位域有什么意义?它会为你产生有意义的结果吗?

也就是说,根据原始操作数的签名,两个操作数将被提升为int / unsigned的最小大小。然后将这些提升的值与按位运算符进行比较。

这表现为你的第二个例子:较小的一个在MSB一侧用零填充(如果你愿意,推到LSB一侧)。

如果一个操作数是有符号且为负数而另一个操作数是无符号的,则在执行位操作之前,负数将被转换为全等无符号数。

如果不是整数而不是std::bitset,则不能对不同大小的位集进行按位运算。

答案 2 :(得分:1)

0 0 0 0 0 1 1 0较小的一个用零扩展并推到 0 0 1 0 0 0 0 1最不重要的一面。