十进制数到32位二进制

时间:2017-06-07 07:39:42

标签: c++ bit-manipulation

int main()
{
    unsigned n;
    cin>>n;
    for(int i=(1<<31);i>0;i/=2)
        (i&n)?(cout<<1):(cout<<0);
}

我使用n = 1运行以下代码,但它在控制台上没有打印任何内容。将变量i的类型更改为unsigned做了诀窍并打印00000000000000000000000000000001.知道为什么?

2 个答案:

答案 0 :(得分:3)

假设有两个补码,1 << 31会产生负值,所以你对i的测试&gt;第一次测试时,0立即失败。你很可能会在i != 0之后获得更多的运气。

但是我们知道1 << 31是有符号整数溢出,无论如何都是未定义的行为!所以你也应该做1U << 31。如果将正值分配给有符号的int(无法保存它),则会再次出现未定义的行为。所以正确的for循环看起来像这样:

for(unsigned int i = 1U << 31; i > 0; i /= 2)

虽然无符号值的i /= 2等同于bitshift(并且很可能被编译为),但我会在这里明确地优先使用bitshift操作(i >>= 1),因为这是你实际想要的

答案 1 :(得分:2)

鉴于您的平台是32位的,具有值(i <&lt; 31)的int i是负数。因此,执行永远不会进入for循环,因为你想要i> 0。