在Python中将数字循环移位(或旋转)数字

时间:2018-09-28 12:29:22

标签: python bit-shift digits

假设我输入以下内容:

1234

如何获得以下输出?

3412

这是通过将输入的数字循环移位(或旋转)两次而获得的。

我尝试了以下代码:

number = 1234
bin(number >> 1)

但是它没有产生我期望的结果。

4 个答案:

答案 0 :(得分:6)

>>运算符执行binary bitshift

它将1234的二进制表示形式向右移动,丢弃最右边(最低有效)位。

因此,您的代码不会产生3412

您可能希望改为旋转字符串:

>>> def rotr(string, n):
...     return string[n:] + string[:n]
... 
>>> rotr("1234", 2)
'3412'

您还可以随后将其转换回整数

>>> int('3412')
3412

答案 1 :(得分:3)

我将转换为字符串以对其进行切片。

number=1234
right_shift_no = 2
new_number = int(str(number)[right_shift_no:]+str(number)[:right_shift_no])

答案 2 :(得分:3)

这是懒人的版本:

>>> from collections import deque
>>> number = 1234
>>> d = deque(str(number))
>>> d.rotate(2)
>>> result = int(''.join(d))
>>> result
3412

答案 3 :(得分:2)

如果您必须坚持使用数字(尽管我会先使用字符串选项)

from math import log10, floor
s = 2  # digits to shift by
p = 10 ** s  # that as a power of 10
n = 1234
rhs = n // p  # right hand side of result (here 12)
rhs_n = floor(log10(rhs)) + 1  # number of digits in rhs
rhs + (n % p) * 10 ** rhs_n  # add other digits, n % p, shifted by size of rhs

以及所有功能一起使用

from math import log10, floor

def rotate(n, s):
    p = 10 ** s
    rhs = n // p
    return rhs + (n % p) * 10 ** (floor(log10(rhs)) + 1)