【发布时间】:2011-05-04 18:21:11
【问题描述】:
我低估了>> 运算符的复杂性;它没有像我想象的那样做。
我想将 uint 的值右移 6542454。我认为它是这样工作的:
val (is) == 11000111101010001110110val >> 1 == 1100011110101000111011val >> 2 == 110001111010100011101val >> 3 == 11000111101010001110val >> 4 == 1100011110101000111val >> 5 == 110001111010100011val >> 6 == 11000111101010001val >> 7 == 1100011110101000 p>
实际上,结果是:
val >> 1 == 1100011110101000111011val >> 2 == 110001111010100011101val >> 3 == 11111001100100110010011val >> 4 == 1111100110010011001001val >> 5 == 111110011001001100100val >> 6 == 11111001100100110010val >> 7 == 10011011111110111111100
第 3 次操作显然做了一些我不明白的事情,并且事情从那里出轨了。似乎在第 7 次手术中又做了我不明白的事情。
连续 7 次使用 >>= 运算符会产生我期望的值:
val >>= 1 == 1100011110101000111011val >>= 1 == 110001111010100011101val >>= 1 == 11000111101010001110val >>= 1 == 1100011110101000111val >>= 1 == 110001111010100011val >>= 1 == 11000111101010001val >>= 1 == 1100011110101000
为什么val >> 3 产生的结果与 3 次调用 val >>= 1 的结果不同?
更新:
using a decimal to binary converter on the web that was truncating my decimal input to 7 digits 是我的错。从 Visual Studio 复制 + 粘贴十进制值时,我没有注意到发生截断。
被移位的实际值是 654245426,正如每个人都正确指出的那样,C# 完美地移位了这个值。
【问题讨论】:
-
您能否提供一个简单的示例程序来复制该问题?您描述的行为违反了 C# 规范,因此值得检查您是否有其他问题,例如计算移位的代码中的运算符优先级问题。
-
你能显示你用来打印值的代码吗?您 >>3 在 12 月(8178067)而不是 817806 中显示几乎正确的结果。所以我猜您的打印代码已关闭...