1

我正在寻找一种方法来改变这种模式:

6 24 96

所有这些数字都是 2 的倍数,所以我想有办法改变它们

我想改变它们,所以我得到了模式,但它可能会在循环中不断重复

6,24,96,6,24,96...

编程语言不重要,概念很重要

4

1 回答 1

2

将一个数乘以 2 n相当于将其左移n位。乘以 4 可以通过左移 2 位来完成。

06 10 = 00000110 2
24 10 = 00011000 2
96 10 = 01100000 2

如果你想循环这个模式,你可以向左旋转而不是简单地向左移动。要向左旋转 2 位,您需要向左移动 2 位,然后将最左边的两位按位或返回到数字的右侧。如果您使用的是 8 位数字,则可以使用类似 C 的语法将其编写为:

(n << 2) | (n >> 6)

有趣的是,如果将 96 向左旋转两位,则不会得到 384,因为它比 8 位字节所能容纳的还要大。相反,您会得到 129,因为 1 位中的一个最终会旋转回右侧。

006 10 = 00000110 2
024 10 = 00011000 2
096 10 = 01100000 2
129 10 = 10000001 2

如果你再旋转 129 次,你最终会回到 6 的起点。

这是一个演示这一点的交互式 Python 会话。请注意,将n{0:3}格式化为十进制数和零填充的二进制数。{0:08b}

>>> n = 6
>>> n = ((n << 2) | (n >> 6)) & 0xFF; print '{0:3} {0:08b}'.format(n)
 24 00011000
>>> n = ((n << 2) | (n >> 6)) & 0xFF; print '{0:3} {0:08b}'.format(n)
 96 01100000
>>> n = ((n << 2) | (n >> 6)) & 0xFF; print '{0:3} {0:08b}'.format(n)
129 10000001
>>> n = ((n << 2) | (n >> 6)) & 0xFF; print '{0:3} {0:08b}'.format(n)
  6 00000110
>>> n = ((n << 2) | (n >> 6)) & 0xFF; print '{0:3} {0:08b}'.format(n)
 24 00011000
>>> n = ((n << 2) | (n >> 6)) & 0xFF; print '{0:3} {0:08b}'.format(n)
 96 01100000
>>> n = ((n << 2) | (n >> 6)) & 0xFF; print '{0:3} {0:08b}'.format(n)
129 10000001
>>> n = ((n << 2) | (n >> 6)) & 0xFF; print '{0:3} {0:08b}'.format(n)
  6 00000110
于 2013-06-14T02:27:36.577 回答