C中的一元运算符否定不起作用

时间:2015-07-11 15:01:40

标签: c bit-shift unary-operator

我试图在C中使用一元运算符〜来翻转数字的位,但函数似乎没有返回任何内容。我所做的代码如下:

#include<stdio.h>
int flipBits(int n) {
    return ~n;
}
void convertbinary(int n)
{
    while(n>0)
    {
        printf("%d",n%2);
        n=n/2;
    }
}
int main()
{
    int n=21;
    int x=flipBits(n);
    convertbinary(x);
}

上面代码的输出都没有。它返回-22。 我最终想要完成的是将给定数字的MSB更改为0.我想出的解决方案是

n&&((n^~(n)>>1)

因此,基本上对数字进行异或,以得到所有1,然后右移以使MSB 0和AND与原始数字进行比较,以得到原始数字0的MSB。 例如

if n=21 i.e. 10101; ~n=01010; n^~n=11111; (n^~n)>>1 = 01111; n&&((n^~n)>>1)=00101

如果我做错了,请纠正我。谢谢。

1 个答案:

答案 0 :(得分:1)

代码不会打印任何内容,因为21的否定是负数。

21 = 0000000...010101

翻转每一位产生:

1111111...101010

因此,循环条件(n > 0)永远不会成立。您可能需要while (n != 0)代替:

void convertbinary(int n)
{
    while (n != 0)
    {
        printf("%d",n%2);
        n=n/2;
    }
}

或者您可以继续使用n > 0并将n设为unsigned