7

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

例如,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.
4

3 回答 3

7

位运算符总是对提升的操作数起作用。因此,究竟可能发生什么取决于一个(或两个)位域是否已签名(因为这可能会导致符号扩展)。

因此,对于您的示例值,具有二进制值的位字段0 1 1 0将被提升为int 6,而具有二进制值的位字段0 0 1 0 0 0 0 1将被提升为int 33,并且这些操作数将与任何操作一起使用.

于 2011-06-09T16:49:49.220 回答
2

0 0 0 0 0 1 1 0 较小的用零扩展并推到 0 0 1 0 0 0 0 1 最低有效侧。

于 2011-06-09T17:03:35.500 回答
2

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

也就是说,两个操作数都将被提升到最小大小int/unsigned有符号取决于原始操作数的符号。然后这些提升的值将与按位运算符进行比较。

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

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

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

于 2011-06-09T17:47:03.437 回答