繁体   English   中英

8位按位表示64位整数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM