[英]8-bit Bitwise for 64 bit integer
我想实现64位整数的按位循环移位。
ROT(a,b)
将把位置i
位移动到位置i+b
。 (a是64位整数)
但是,我的AVR处理器是8位处理器。 因此,要表达a
,我必须使用unit8_t x[8]
。
x[0]
是的8个最高位显著a
。 x[7]
是8个最低显著位a
。 有人可以帮助实现数组x
ROT(a,b)
吗?
谢谢
如果基础处理器是64位,8位或1位,则没有功能上的区别。 如果编译器符合要求-那就好了。 使用uint64_t
。 代码没有“必须使用unit8_t
”,因为处理器是8位处理器。
uint64_t RPT(uint64_t a, unsigned b) {
return (a << (b & 63)) | (a >> ((64 - b) & 63));
}
增加了()以使内容更加明确。
& 63
(或%64
是您喜欢的样式)已添加,以确保b
仅6个LSBit有助于移位。 任何更高的位仅意味着循环移位的多个“革命”。
((64 - b) & 63)
可以简化为(-b & 63)
。
-
但是,如果OP仍然希望“以数组unit8_t x[8]
实现ROT(a,b)
”:
#include <stdint.h>
// circular left shift. MSByte in a[0].
void ROT(uint8_t *a, unsigned b) {
uint8_t dest[8];
b &= 63;
// byte shift
unsigned byte_shift = b / 8;
for (unsigned i = 0; i < 8; i++) {
dest[i] = a[(i + byte_shift) & 7];
}
b &= 7; // b %= 8; form bit shift;
unsigned acc = dest[0] << b;
for (unsigned i = 8; i-- > 0;) {
acc >>= 8;
acc |= (unsigned) dest[i] << b;
a[i] = (uint8_t) acc;
}
}
@vlad_tepesch建议了一种强调AVR 8位性质的解决方案。 这是未经测试的尝试。
void ROT(uint8_t *a, uint8_t b) {
uint8_t dest[8];
b &= 63; // Could be eliminated as following code only uses the 6 LSBits.
// byte shift
uint8_t byte_shift = b / 8u;
for (uint8_t i = 0; i < 8u; i++) {
dest[i] = a[(i + byte_shift) & 7u];
}
b &= 7u; // b %= 8u; form bit shift;
uint16_t acc = dest[0] << b;
for (unsigned i = 8u; i-- > 0;) {
acc >>= 8u;
acc |= (uint8_t) dest[i] << b;
a[i] = (uint8_t) acc;
}
}
为什么不把工作留给编译器而只实现一个函数
uint64_t rotL(uint64_t v, uint8_t r){
return (v>>(64-r)) | (v<<r)
}
我认为x(i)是8位。 从X(i,j)向左旋转n次,其中i是索引数组x(0)-> x(7),j是元素内的位位置
那么此位将以Y((i + n)/ 8,(i + n)&7)结尾。这将处理最多63个任意旋转的数字> 63,只需对其进行调制即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.