比较不同大小的位域

10

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

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

1
我使用了 C++ 标签,因为我不确定这是否因语言而异。 - Maxpm
3个回答

8
位运算符始终作用于提升的操作数。因此,可能发生的确切情况取决于一个或两个二进制位字段是否带符号(因为这可能导致符号扩展)。
因此,对于您的示例值,具有二进制值0 1 1 0的位域将被提升为int6,而具有二进制值0 0 1 0 0 0 0 1的位域将被提升为int 33,并且这些都是将与任何操作一起使用的操作数。

那么两个操作数都会被提升为能够容纳一对中最大的类型(可能是有符号的),然后比较将按照正常方式进行?这基本上意味着较小的一个会被零扩展并推到较大的一个的最低有效位,对吗? - Maxpm
@Maxpm:我认为这就是问题的关键。对我来说,最简单的方法就是将运算符视为在int上操作(假设位域足够小),而不是考虑移位和其他内容。但是不同的人以不同的方式理解事物... - Michael Burr

3

0 0 0 0 0 1 1 0

较小的那个数在末尾添加零并向最低位方向推移。


2
如果您实际上使用值作为位字段,那么比较不同大小的位字段有什么意义?这对您是否会产生有意义的结果?
话虽如此,两个操作数将被提升为最小的int/unsigned大小,其有符号性取决于原始操作数的有符号性。然后,这些提升的值将通过按位运算符进行比较。
这就像您的第二个示例一样:较小的一个在MSB侧填充了零(如果您喜欢,则推到LSB侧)。
如果一个操作数是有符号的且为负数,而另一个操作数是无符号的,则在执行位操作之前,负数将转换为相应的无符号数。
如果您指的是std::bitset而不是整数,则不能对不同大小的位集执行位操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接