arduino的C位旋转操作



我正在为带有移位寄存器的led矩阵项目编程arduino,我必须旋转输出值(这是一个字节),但当我使用"<<"运算符时,它不会正确旋转值,只是它将零添加到LSB。

byte ilk=0b01100001;
int latch=10;
int clock=8;
int data=9;
void setup(){
pinMode(latch,OUTPUT);
pinMode(data,OUTPUT);
pinMode(clock,OUTPUT);
}
void loop(){
  digitalWrite(latch,LOW);
  shiftOut(data,clock,MSBFIRST,ilk);
  digitalWrite(latch,HIGH);
  ilk=ilk<<1;
  delay(200);
}
是否有像ROL这样的操作符?

因为<<不是"左旋"操作符。这是算术左移运算符。你可以用

uint32_t rotl(uint32_t n, uint32_n b)
{
    return (n << b) | (n >> (32 - b));
}

。如果您希望与所使用的整型的大小无关,则将sizeof(n) * CHAR_BIT - b写在位或运算符的右侧。

你也可以这样写

uint16_t tmp = ilk << 1;
ilk = (uint8_t)tmp + *(((uint8_t *)(&tmp))+1);

的想法是&tmp是指向tmp的一个单词指针。然后强制类型转换将其转换为字节指针。给这个指针加1,使它向上移动一个字节。解引用将传递tmp的高字节,并将其添加到tmp中。然后将结果赋值给ilk,获取该操作的低字节。我没有仔细检查,但如果编译器足够聪明,它可以优化这个"将tmp的hi字节添加到tmp,只取结果的low字节"。

或者你可以将它实现为

ilk = ilk << 1 + (ilk >= (1 << sizeof(ilk));

在你的情况下

ilk = ilk << 1 + (ilk >= 128);

请注意,我的两个解决方案都不需要编译器优化几个位的移位

在我的脑海中这应该是可行的,溢出位被丢弃

byte temp = ilk & 1;
ilk <<= 1;
ilk |= (temp >> sizeof(temp));

最新更新