我该如何在C/C++中执行无符号右移操作(Java中的>>>)?

31

在C/C++中如何执行无符号右移操作(类似Java中的 >>>)?

3个回答

38
在C语言中,要进行无符号移位,只需要在无符号类型上进行移位操作。
unsigned int result = (unsigned int)valueToBeShifted >> shiftAmount;

请注意,在C语言中,对于有符号类型的>>操作并不保证会得到有符号右移结果,这是实现定义的行为。然而,大多数常见的实现方式如果类型是有符号的,则会产生一个有符号的右移。


22

>>>是无符号右移位运算符,因此我认为在C语言中这应该与下面的代码相同:

>>

unsigned int foo;
unsigned int bar = foo >> whatever;

1

C++中对于无符号值进行右移和有符号值进行右移的行为是相同的。如果最高位被设置,那么 >> 会移入一个1。

unsigned int myInt = 0x80000000;
myInt >>= 1;

myInt中存储的结果将是0xC0000000。

然而,如果最高有效位未设置,则对无符号值进行右移操作将按预期工作。

unsigned int myInt = 0x40000000;
myInt >>= 1;

结果将会是0x20000000

因此,在C++中,您可以采取以下措施以获得所需的行为:

  1. 进行一次移位,清除最高有效位,然后进行其余的移位。
  2. 右移N位,并清除前N位。

这不是真的...在C/C++中,无符号整数和有符号整数的左移行为是相同的,但是右移却不同。 - Mika Lindqvist

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