This question already has answers here:
Closed 6 months ago.
How does this work? Weird Towers of Hanoi Solution
(3个答案)
我是一个C语言的初学者,我有一个汉诺塔的代码,但是有人能解释一下这些位运算符在做什么吗?如果I的值是1,那么源和目标输出值是多少?
(3个答案)
我是一个C语言的初学者,我有一个汉诺塔的代码,但是有人能解释一下这些位运算符在做什么吗?如果I的值是1,那么源和目标输出值是多少?
source = (i & i-1) % 3;
target = ((i | i-1) + 1) % 3;
最佳答案
i & i-1
关闭i
中的最低设置位(如果有任何设置)。例如,考虑i
=200:
200二进制等于1100 1000。(为方便视觉而插入空间。)
要减去1,零会导致我们从下一个位置“借用”,直到达到1,产生11000111。注意,从右边开始,所有的0都变成了1,第一个变成了0。&
产生在两个操作数中设置的位。由于i-1
将所有位都更改为第一个位,因此这些位在&
中是清晰的-在i
和i-1
中没有一个更改的位是相同的,因此它们都不是一个。i
中的另一个在最低一位以上,在i
和i-1
中都是相同的,所以它们仍然是i & i-1
中的一个。i & i-1
的结果是11000000。
1100 0000是1100 1000,最低设置位关闭。
然后% 3
选择河内塔楼中的哪根柱子作为震源。这在this question中讨论。
类似地,i | i-1
打开i
中的所有低位零点,所有零点直到最低的一位。然后(i | i-1) + 1
添加一个。其结果与在i
中向最低一位添加一个相同。也就是说,结果是i + x
,其中x
是i
中设置的最低位。使用我们的示例值:i
为1100 1000,i-1
为1100 0111。i | i-1
是1100 1111。(i | i-1) + 1
是1101 0000,等于1100 1000+0000 1000。
同样,% 3
选择一个极点。
关于c - 在C中使用按位运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56330659/