鉴于此代码打印出整数中的所有位:
private string getBitLiteral(bool bitVal)
{
if (bitVal)
{
return ("1");
}
else
{
return ("0");
}
}
Int64 intThisHand = 127;
for (int i = 64; i > 0; i--)
{
HttpContext.Current.Response.Write(
getBitLiteral((intThisHand & (1 << i)) != 0)
);
}
为什么打印出来:
1000000000000000000000000011111110000000000000000000000000111111
首先我是正确的,因为我希望最后7位是1的
其次,为什么中间有一些1?我希望它们都是0,除了尾随的7 1。
答案 0 :(得分:18)
1 << i
是32位整数,因此溢出
我认为1l << i
会解决它
((long)1)<<i
可能更具可读性。
此外,您还有一个错误。你想要63到0而不是64到1.因为1&lt;&lt;&lt; 1是2而不是1。
答案 1 :(得分:7)
您是否对代码被破坏的原因感到好奇,或者您只是想将数字显示为二进制代码?
如果是后者那么你可以这样做而不是重新发明轮子:
string asBinary = Convert.ToString(intThisHand, 2);
或者,如果你想填充所有64位数字:
string asBinary = Convert.ToString(intThisHand, 2).PadLeft(64, '0');