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

Unary operator negation in C not working

我正在尝试使用 C 中的一元运算符 ~ 翻转数字的位,但该函数似乎 return 什么都没有。我做的代码如下:

#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);
}

以上代码的输出是空的。它return-22。 我最终想要完成的是将给定数字的 MSB 更改为 0。我想出的解决方案是

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

所以,基本上,将数字与其倒数进行异或运算以获得全 1,然后右移以使 MSB 为 0,并与原始数字进行 AND 运算以使原始数字的 MSB 为 0。 例如

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

如果我做错了什么,请指正。谢谢。

代码不打印任何内容,因为 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