我正在寻找一种方法来改变这种模式:
6 24 96
所有这些数字都是2的倍数,所以我认为有一种方法可以改变它们
我想转移它们以便我得到模式,但它可能在循环中不断重复
... 6,24,96,6,24,96
编程语言并不重要,概念是
答案 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