【发布时间】:2017-05-13 11:05:16
【问题描述】:
此代码是书中的示例,该问题需要使用按位 AND 运算符和 shift 运算符将十进制数更改为二进制数。
尽管尝试使用调试编译器理解此代码,但我无法理解代码。
假设对于a 和b,用户输入是10 和8
#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()所以没有参数和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。
【问题讨论】:
-
如果你的书使用了诸如“将十进制转换为二进制”之类的词,你最好把它扔掉。您的程序中没有十进制数字。
-
@n.m.十进制数是用户作为 a 和 b 变量的输入吗?
-
是的,用户以十进制输入数字,但当它们到达您的变量
a和b时,它们不再是十进制。 -
代码也很糟糕。
int_bits(x)被命名为它计算位 in x,但不,它不使用它的参数并计算无符号数中的总位数。并且程序每次打印一点时都会调用这个函数,尽管结果永远不会改变。完全没用。 -
抱歉正确的是int_bits(void),但是还是不明白这段代码的流程
标签: c bit-manipulation operator-keyword shift