如何在此代码中访问各个位?

时间:2018-01-02 08:25:30

标签: c

所以我看到这个代码打印出任意数字的各个位。我不明白为什么要访问各个位而不是整个数字本身

#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 

请帮我理解这段代码。

2 个答案:

答案 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使用>>。例如,如果xb0011,则x >> 1b0001(在这种情况下,您使用零填充最左侧的位置,但在某些情况下,它可能更棘手) 。如果您查看代码示例,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