按位逻辑运算符和移位运算符

时间:2017-05-13 11:05:17

标签: c bit-manipulation operator-keyword shift

此代码是一本书中的示例,该问题需要使用按位AND运算符和shift运算符将十进制数更改为二进制数。 虽然尝试使用调试编译器来理解这段代码,但我无法理解代码。

假设对于ab,用户输入为108

#include <stdio.h>
#include <stdlib.h>


int count_bits (unsigned x)
{

    int bits=0;
    while(x){
        if (x&1U)bits++;
            x>>=1;


    } return bits;
}

int int_bits(void)
{
    return count_bits(~0U);
}

void print_bits(unsigned x)
{
    int i;
    for(i=int_bits(x)-1;i>=0;i--)
        putchar(((x>>i)&1U)?'1':'0');
}
int main(void)
{
 unsigned a,b; /*suppose user input a=10 b=8*/
 printf("enter two positive integer value=\n");
 printf("a=  "); scanf("%u",&a);
 printf("b:  "); scanf("%u",&b);

 printf("\na   =");  print_bits(a);
 printf("\na   =");  print_bits(b);
    return 0;
}

int_bits函数中(~0U)实际上是什么?我的意思是将0更改为1

我知道它调用count_bits函数并返回计数位(~0)值,但为什么x这里有一些随机内存地址,如4294967295

可能是因为int int_bits(void)int_bits()所以没有参数和x10更改为随机地址?

count_bits函数在这里计算多少位?

while (4294967295)  {
if(x&1u)-> (means compare x last digit value with 1) if true, bits ++;
x>>=1; }-> this mean to shift 1 digit of x to right which mean to divide with 2 until quotien is 0

当我尝试调试时,我得到了32的位值
为什么要生成32?这与(~0U)有关所以所有比特都是1还是分裂的遗骸?

print_bits (unsigned x) function, is to produce the result
for(i=int_bits()-1;i>=0;i--)
putchar(((x>>i)&1u)?'1':'0')
the x in this value is 10,8 (user input)
and i is 31 from return bits
32-1=31 will be looping until 0

10>>30表示只在31中将10转移到右边?

它如何产生1010

此代码与生成1010实际比较的内容是什么?

实际上,该程序最终还会产生32数字1010

1 个答案:

答案 0 :(得分:1)

print_bits(unsigned x):

代码使用& 1u(与& 0000000000000001相同)获取十进制数的最后一位,然后如果最后一位为{{,则使用三元运算符放置'1' 1}}(true)和1如果最后一位是0(false)。在每一步中,该数字也会向右移一位(由于0递增),以便通过i获得每一位。

& 1u(和)运算符将两个数字中的每个对应位进行比较,如果有两个&,则创建一个1位,{{1}在所有其他情况下。

此:

1

会给0一个这样的值:

int i = (0101/**/0111) & (0010/**/0101);

通过i0000/**/0000/**/0000/**/0101 // The addition of two sets of 4 0's on the //left was due to me assuming int is 32 bits in your system. )向右移动:

1

会产生这个:

>> 1

多次移位允许通过三元语句检查所有位。

1101

评估0110 的最低位以查看它是否为count_bits (unsigned x): ,同时递增 位,存储位数。如果x1x只会向右移动, 从而使x中的所有1都设置为1(我会做的) 每次迭代都会向x移位(结果会相同)。

int_bits(void)将count_bits中的所有0转换为1,以便它可以用作循环知道何时停止的方式