意外的 C# 位右移结果
本文关键字:右移 结果 意外 | 更新日期: 2023-09-27 17:55:15
我低估了>>
运算符的复杂性;它没有像我想象的那样做。
我想右移uint
值6542454。我认为它是这样工作的:
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# 完美地位移位了这个值。
我编写了代码来输出每个班次:
uint i = 6542454;
for (int j = 0; j < 8; j++)
{
uint k = i >> j;
Console.WriteLine("{1} = {0}", Convert.ToString(k, 2), k);
}
这就是我所期望和确实看到的。
6542454 = 11000111101010001110110
3271227 = 1100011110101000111011
1635613 = 110001111010100011101
817806 = 11000111101010001110
408903 = 1100011110101000111
204451 = 110001111010100011
102225 = 11000111101010001
51112 = 1100011110101000