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

固定的

此代码是书中的一个示例,该问题需要使用按位运算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)做了什么?我这个意思改01

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

也许是因为int int_bits(void)int_bits()所以没有参数,并x从变化10到一个随机地址?

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

应用程序编写器
print_bits(unsigned x):

代码使用& 1u(与 相同& 0000000000000001获取十进制数的最后一位,然后使用三元运算符'1'在最后一位为1(true) 和0最后一位为0(false) 时放入 a 该数字还在每一步中右移一位(由于i递增),以便使用 获得每一位& 1u

&(和)运算符比较在两个数各对应位,并创建一个位1,如果有两个1的和0的在所有其他情况下。

这:

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

会给i这个值:

0000/**/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):

x评估的最低位以查看它是否为1,同时增加位以存储位数。x仅在xis 时右移1,从而使所有1的 inx都设置为0(我会在x每次迭代位时右移(结果将相同)。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章