我试图在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
如果我做错了,请纠正我。谢谢。
答案 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
。