0

我是 C 菜鸟,但有 Java 和 Python 方面的经验。我目前正在做一个关于位操作的作业,并找到了一个向我展示如何做的指南,问题是我不太明白。

c=(c&(1<<n))>>n;

c = 无符号字符

n = 整数,表示 c 的第 n 位。

我理解 & = AND 逻辑门,我也知道它是如何工作的。我知道 << = 左移,>> = 右移。

但是,我无法理解这一切是如何协同工作的。有人可以解释一下这段代码是如何执行的,以及它如何能够返回第 n 位。

4

3 回答 3

3

此代码基本上检查是否设置了第 n 位。

  1. 1 << n,将 1 放在第 n 位
  2. c & (1 << n),如果 c 设置了第 n 位,则将保留第 n 位,否则全部为 0
  3. 最后将它 n 向后移动以使 1 在第一个位置,因此如果设置了第 n 位,则为 1,如果未设置,则为 0

你也可以。
!!(c&(1<<n))
一样的效果

于 2013-10-10T23:27:45.873 回答
1

我也花了一秒钟才弄清楚(我习惯用另一种方式这样做),但这里是:

让我们从代码片段所做的第一件事开始(因为括号)。

1<<n

1 用二进制写成 00000001 并将其向左移动 n 步,基本上只是移动 1,例如 2 步将导致 00000100 和 5 在 00100000。所以你得到的是一个只有第 n 位“切换”的数字上'。

然后这个数字是与你的字符,所以它会返回相同的数字或 0。要了解为什么会发生这种情况,让我们看一些示例(从上到下阅读):

Your number is   0 1 0 1 0 1 1 0
                 & & & & & & & &
And 1<<4 is      0 0 0 1 0 0 0 0
                 | | | | | | | |
result:          0 0 0 1 0 0 0 0

或者

Your number is   0 1 0 1 0 1 1 0
                 & & & & & & & &
And 1<<5 is      0 0 1 0 0 0 0 0
                 | | | | | | | |
result:          0 0 0 0 0 0 0 0

因此,如果 c 的第 n 位“打开”,则与逻辑门之后的结果也会将该位设置为 1。

最后但并非最不重要的一点是,我们希望这个位不要在我们的 c 中的某个位置,而是在开头(或者老实说结尾,但你知道我的意思,这样我们就可以检查它是 0 还是 1,因为 00000001 等于 1并且 00000000 等于 0),所以我们将位移动到最后一位(这很容易,因为我们知道它在第 n 位,所以我们可以说,“嘿,位,向左移动 n 位”,例如00010000>>4等于 00000001)。

就是这样,顺便说一句,你也可以使用((c<<n)>>n),这是我通常使用的,我认为它更容易理解(或者?)

于 2013-10-10T23:42:44.480 回答
0

c&(1<<n)这是测试第 n 位是 1 还是 0。

在此操作之后,您将得到全零,或n-1零后接一。

然后应用>>n从上一个操作中获取第 n 位作为 LSB。然后将其分配给变量。

于 2013-10-10T23:28:32.127 回答