意外的C#位右移结果

wit*_*ith 4 c# bit-shift

我低估了>>操作员的复杂性; 它没有做我想的那样.

我想右移uint6542454 的值.我认为它的工作原理如下:

val (is) == 11000111101010001110110
val >> 1 == 1100011110101000111011
val >> 2 == 110001111010100011101
val >> 3 == 11000111101010001110
val >> 4 == 1100011110101000111
val >> 5 == 110001111010100011
val >> 6 == 11000111101010001
val >> 7 == 1100011110101000

实际上,结果是:

val >> 1 == 1100011110101000111011
val >> 2 == 110001111010100011101
val >> 3 == 11111001100100110010011
val >> 4 == 1111100110010011001001
val >> 5 == 111110011001001100100
val >> 6 == 11111001100100110010
val >> 7 == 10011011111110111111100

第三次操作显然做了一些我不理解的事情,事情从那里开始.似乎在第7次操作中再做一次我不理解的事情.

>>=连续7次使用运算符产生我期望的值:

val >>= 1 == 1100011110101000111011
val >>= 1 == 110001111010100011101
val >>= 1 == 11000111101010001110
val >>= 1 == 1100011110101000111
val >>= 1 == 110001111010100011
val >>= 1 == 11000111101010001
val >>= 1 == 1100011110101000

为什么val >> 3不能产生与3次调用相同的结果val >>= 1

更新:

在网上使用十进制到二进制转换器的错误是将我的十进制输入截断为7位数.从Visual Studio复制+粘贴十进制值时,我没有注意到截断发生.

被移位的实际值是6542454 26,并且正如每个人都正确指出的那样,C#完美地对这个值进行了位移.

Mat*_*len 6

我编写代码来输出每个班次:

uint i = 6542454;

for (int j = 0; j < 8; j++)
{
    uint k = i >> j;
    Console.WriteLine("{1} = {0}", Convert.ToString(k, 2), k);
}
Run Code Online (Sandbox Code Playgroud)

这就是我期望并且确实看到的.

6542454 = 11000111101010001110110
3271227 = 1100011110101000111011
1635613 = 110001111010100011101
817806 = 11000111101010001110
408903 = 1100011110101000111
204451 = 110001111010100011
102225 = 11000111101010001
51112 = 1100011110101000
Run Code Online (Sandbox Code Playgroud)