比特移位重复模式

时间:2013-06-14 02:12:33

标签: design-patterns byte-shifting

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

6 24 96

所有这些数字都是2的倍数,所以我认为有一种方法可以改变它们

我想转移它们以便我得到模式,但它可能在循环中不断重复

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

编程语言并不重要,概念是

1 个答案:

答案 0 :(得分: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会话,展示了这一点。请注意,{0:3} n 格式化为十进制,将{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