C 按位显示二进制
转载:https://mp.weixin.qq.com/s?__biz=Mzk0NDYzNTI1Ng==&mid=2247483733&idx=2&sn=728c93b046d5967755dd35f464cdcd8b&chksm=c320ed42f45764547c033a1a7cd04e72b7d054e5dc9346627ac1b0707def1f58c20a1b191567#rd
C 按位显示二进制
在C语言的printf中不能直接显示一个数字的二进制。
但我们可以通过位运算获取数字每一位的值然后显示。
获取数字最小位的值
我们以25为例子,其二进制为1101,那么我们要获取其最底位的值就是1。
通过位与运算1101 & 0001 = 0001可以得到结果。
同理,我们若想获得其第二位的值也是同理,只需要把第二位变成最小位即可,(1101 >> 1) & 0001 = 0110 & 0001 = 0000。
借助此,我们可以写出如下函数:
void printbit(unsigned int num){
for (unsigned int i=1;i != 0;i <<= 1){
unsigned int bit = num & 1;
printf("%u", bit);
num >>= 1;
}
printf("\n");
}
但是,实际效果却不太理想。他把显示的数值倒了过来。
当然,处理的方法有很多,我的方法是再做一个函数用于把数值倒过来。
把数值倒过来
我们只需要把num = 00000000000000000000000000011001变成num = reverse_bits(num) = 10011000000000000000000000000000即可。
reverse_bits的代码如下:
unsigned int reverse_bits(unsigned int num){
unsigned int answer = 0;
for (unsigned int i=1;i != 0;i <<= 1){
answer <<= 1;
unsigned int bit = num & 1;
answer |= bit;
num >>= 1;
}
return answer;
}
同理,变量bit是指num的最低位的值,我们要讲这个值写到answer中。
然后,让answer向左移位一位,效果如下:
10011最底位是0001
写入到answer:
answer = 0001 & 0000 = 0001
移位:
answer = 0010
再重复刚刚的步骤:
bit = 0
answer = 0010
answer = 0100
再重复刚刚的步骤:
bit = 1
answer = 0101
answer = 1010
再重复刚刚的步骤:
bit = 1
answer = 1011
最终便可以转换完成。
注意:
我们使用了unsigned int i=1;i != 0;i <<= 1来计算整数二进制的总位数。
如,系统计算整数的位数是5位,那么就会有如下效果:
i = 00001,然后经过4次移位,得到i = 10000。当第五次时i = 00000 = 0,循环结束。
注意:
25也就是1101,倒过来的结果并不是1011。
因为系统内存储25的二进制是:00000000000000000000000000011001,
所以倒过来后是:10011000000000000000000000000000。
当然,不同的编译器结果可能是不同的。

浙公网安备 33010602011771号