【问题标题】:Bitwise logical operator and shift operator按位逻辑运算符和移位运算符
【发布时间】:2017-05-13 11:05:16
【问题描述】:

此代码是书中的示例,该问题需要使用按位 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&gt;&gt;30 表示将31 右移至10

它如何产生1010

这段代码与产生1010的实际比较是什么?

其实程序最后也会产生32数字和1010

【问题讨论】:

  • 如果你的书使用了诸如“将十进制转换为二进制”之类的词,你最好把它扔掉。您的程序中没有十进制数字。
  • @n.m.十进制数是用户作为 a 和 b 变量的输入吗?
  • 是的,用户以十进制输入数字,但当它们到达您的变量 ab 时,它们不再是十进制。
  • 代码也很糟糕。 int_bits(x) 被命名为它计算位 in x,但不,它不使用它的参数并计算无符号数中的总位数。并且程序每次打印一点时都会调用这个函数,尽管结果永远不会改变。完全没用。
  • 抱歉正确的是int_bits(void),但是还是不明白这段代码的流程

标签: c bit-manipulation operator-keyword shift


【解决方案1】:
print_bits(unsigned x):

代码使用&amp; 1u(与&amp; 0000000000000001相同)取十进制数的最后一位,然后如果最后一位为1(真)和@,则使用三元运算符放入'1' 987654326@ 如果最后一位是0 (false)。该数字也在每一步中再右移一位(由于i 递增),以便使用&amp; 1u 获得每一位。

&amp; (and) 运算符比较两个数字中的每个对应位,如果有两个 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 (&gt;&gt; 1):

1101

会产生这个:

0110 

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

count_bits (unsigned x):

x 的最低位被评估以查看它是否为1,同时递增 bits,存储位数。 x 仅在 x1 时右移, 从而使x中的所有1都设置为0(我本来只是 每次迭代位时将x 右移(结果相同)。

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

【讨论】:

  • & 运算符比较 x 和 1U,我得到的 x 是 4294967295 并与 0000000000000001 比较? 4294967295,是自动转二进制吗?再右移一位意味着将 x 除以 2?
  • @devina "Decimal" 是指以 10 为底,右移允许数字的最低位成为过去的高位,以便 & 运算符隔离该位(而不是每次都是原来的第一位)。
  • 我了解 & 运算符和移位运算符的工作原理,但在这段代码中 x{ if (x&1U) bits++ x>>=1;}。 x 的值是多少?和 count_bits(~0) 有什么关系?十进制的 10 将产生二进制的 1010 运算符和如何在 printf 中产生 1010?
  • @Devina int_bits(void) 将 count_bits 中的所有 0 转换为 1,以便循环知道何时停止。
  • 在 tis 代码中 int_bits() 的值是 31 对吗?是否可以将 print_bits 函数中的条件更改为 for (i=int_bits();i>0;i--?)?
猜你喜欢
  • 1970-01-01
  • 2012-07-20
  • 2011-10-23
  • 1970-01-01
  • 2020-01-23
  • 2016-07-18
  • 2014-07-01
  • 2015-11-24
  • 2017-11-06
相关资源
最近更新 更多