需求
- 需求:对于一个长度为128位的无符号整数,在只有最大UINT64的环境下,实现循环左移的操作。
分析
分析:循环位移的算法实现思路:
例:num(UINT16) 循环左移 i 位
1.将num左移i位
num << i
2.将num右移 总位数-i 位
num >>(16 - i)
3.将两个数进行或运算
(num << i) ^ (num >> (16 - i))
但是对于大数,无法直接对数字进行运算。所以采取对大数分割成可以计算的小数,以128位数为例,分割成16个8位整数 UINT8[16] 对每个字节单独计算
单个字节的计算与上述位移思想类似,但是一个单独字节旋转位移的结果设计两个相邻的单独字节
以第0字节为例,为第0字节左移的部分和1字节右移的部分或运算得到
实现
实现代码
// 旋转的数 temp ,旋转位数 num