在C中使用逐位,将x向右旋转4

  • 本文关键字:旋转 c bit-manipulation
  • 更新时间 :
  • 英文 :


不允许循环。只允许使用~&^|+运算符<lt>gt!

将x向右旋转4。

示例:rotate4(0x87654321(=0x18765432

最大操作次数:12

int rotate4(int x){
CODE

我有

int rotate4(int x){
return (x << 28) | (x >> 4);

这是输出一个负数,看起来是正确的,但却是负数。

测试:答案应为134217728[0x8000000]

我的答案是-134121728[0xf8000000]

我的思考过程是:

x<lt;将4个LSB代码向左移动28个空格,这意味着4个LSB将留在MSB位置。

x>gt;4使4个LSB下降,使得4个MSB为0。

我的代码是不是因为算术右移而产生了错误的结果?

将带符号的int中的数据左移超过第30位会调用未定义的行为-您将把数据移到带符号的位中。这就是为什么我们几乎不应该对逐位运算符使用有符号操作数的众多原因之一。

在您的情况下,您甚至不能将0x87654321存储在int中,因为在转换之前它已经太大了。

更改为unsigned int或更好的uint32_t。那么这应该给出结果CCD_ 6。

最新更新