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
当然,不同的编译器结果可能是不同的。

posted @ 2020-08-07 12:37  桓公子  阅读(709)  评论(0)    收藏  举报