如果使用按位运算符(&
,|
等)来比较不同大小的两个位域,会发生什么?
例如,将0 1 1 0
与0 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.
答案 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最不重要的一面。