C:二元leftrotate

Nic*_*s C 3 c binary binary-operators

我在C中写了这个小代码:

int leftrotate (int x, int offset)
{
    return ( x << offset ) | ( x >> (32 - offset));
}
Run Code Online (Sandbox Code Playgroud)

我期望二进制leftrotate一个整数,这意味着我期望将所有位从给定的偏移移动到左边,并且如果数字太大则将其缩小.

例如,当我输入:

10100110100110100101000011111101 = 2795131133 = a69a50fd
Run Code Online (Sandbox Code Playgroud)

我期待作为回报:

01101001101001010000111111011010 = 1772425178 = 69a50fda
Run Code Online (Sandbox Code Playgroud)

(请注意,十六进制一个在开始时正处于结束因为我选择在该特定示例中的偏移4)

但相反,我得到了:

11111111111111111111111111111010 = 4294967290 = fffffffa
Run Code Online (Sandbox Code Playgroud)
  • 任何想法可以来自或我做错了什么?
  • 我使用的是正确的int吗?我应该用uint吗?或许char
  • 它取决于我的计算机的体系结构(32位还是64位)?
  • 我想这取决于整数的长度(这就是我使用32位长度数的原因)?

谢谢 !!!

Car*_*rum 6

它的实现定义了右移是算术移位还是逻辑移位.在你的情况下,它似乎是一个算术移位,所以你在>>表达式的一半中得到了符号扩展.您需要输入unsigned演员或作业才能获得所需的行为.

unsigned int y = x;
return ( y << offset ) | ( y >> (32 - offset));
Run Code Online (Sandbox Code Playgroud)

任何想法可以来自或我做错了什么?

由于右移有符号值而导致符号扩展.

我使用正确的int吗?我应该使用uint吗?或者也许是char?

更改为unsigned int功能签名可能是最简单的,是的.

它取决于我的计算机的体系结构(32位还是64位)?

不,可能不是.

我想这取决于整数的长度(这就是我使用32位长度数的原因)?

不,可能不是.但是,您可以使程序不依赖于整数的大小:

return (y << offset) | (y >> ((sizeof y * CHAR_BIT) - offset));
Run Code Online (Sandbox Code Playgroud)