我是 C 菜鸟,但有 Java 和 Python 方面的经验。我目前正在做一个关于位操作的作业,并找到了一个向我展示如何做的指南,问题是我不太明白。
c=(c&(1<<n))>>n;
c = 无符号字符
n = 整数,表示 c 的第 n 位。
我理解 & = AND 逻辑门,我也知道它是如何工作的。我知道 << = 左移,>> = 右移。
但是,我无法理解这一切是如何协同工作的。有人可以解释一下这段代码是如何执行的,以及它如何能够返回第 n 位。
此代码基本上检查是否设置了第 n 位。
你也可以。
!!(c&(1<<n))
一样的效果
我也花了一秒钟才弄清楚(我习惯用另一种方式这样做),但这里是:
让我们从代码片段所做的第一件事开始(因为括号)。
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)
,这是我通常使用的,我认为它更容易理解(或者?)
c&(1<<n)
这是测试第 n 位是 1 还是 0。
在此操作之后,您将得到全零,或n-1
零后接一。
然后应用>>n
从上一个操作中获取第 n 位作为 LSB。然后将其分配给变量。