所以我看到这个代码打印出任意数字的各个位。我不明白为什么要访问各个位而不是整个数字本身
#include <stdio.h>
int main()
{
int x=10, b;
for(b=0; x!=0; x>>=1) {
printf("%d:%d\n", b, (x&1));
b++;
}
}
输出:
0:0 1:1 2:0 3:1
请帮我理解这段代码。
答案 0 :(得分:0)
您的帖子中有两个问题:如何访问单个位?以及如何选择那个位?
关于第一个问题,假设您想要访问不太重要的位(或者,为了使其更简单,右边的位),您可以使用掩码:假设您的数据是{{1例如,您可以使用b0011
进行掩码(即十进制b0001
)。
1
0 0 1 1
& 0 0 0 1
---------
0 0 0 1
运算符是按位&
。如果您查看代码示例,则可以使用and
printf("%d:%d\n", b, (x&1));
,x & 1
,即打印最x
位。
现在出现第二个问题:如何将每个位置一个接一个地放在最右边的位置(否则,如何选择要打印的位)?一个简单的解决方案是,每当您想要选择下一位(即当前位的左侧位)时,shift
数据1
位于右侧。
在C中,您可以shift
使用>>
。例如,如果x
为b0011
,则x >> 1
为b0001
(在这种情况下,您使用零填充最左侧的位置,但在某些情况下,它可能更棘手) 。如果您查看代码示例,x>>=1
中的for-loop
x >> 1
会在x
中分配 0 0 1 1 = x 0 0 0 1 = x
& 0 0 0 1 & 0 0 0 1
--------- x >> 1 = b0001 -> x ---------
0 0 0 1 0 0 0 1
。
因此,假设你采用前面的例子:
x != 0
等等...
最后一个奖励点,循环停止条件为1
,这意味着您不打印数据的所有位,而只打印位到最左边的x
(包括在内)。例如,在上面的示例中,在打印最右边的两个位之后,0
变为pl
并且循环退出。
答案 1 :(得分:0)
在您的代码中,您将以二进制形式打印X变量的值。为此,您的代码使用逻辑运算作为AND运算符和右移。
在循环条件中,您将X变量向右移位一位。
for b = 0 you get x = 1010
for b = 1 you get x = 101
for b = 2 you get x = 10
for b = 3 you get x = 1
然后,在你的打印中,显示你的循环迭代器(b)和你的X变量AND 1。
AND运算符获取此值:
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
在您的情况下,您有:
1010 AND (000)1 = 0
101 AND (00)1 = 1
10 AND (0)1 = 0
1 AND 1 = 1