我正在为带有移位寄存器的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这样的运营商。
答案 0 :(得分:4)
因为<<
不是“向左旋转”操作符。这是算术左移算子。你可以使用像
uint32_t rotl(uint32_t n, uint32_n b)
{
return (n << b) | (n >> (32 - b));
}
代替。如果您希望它与您使用的整数类型的大小无关,请在按位OR运算符的右侧写sizeof(n) * CHAR_BIT - b
。
答案 1 :(得分:1)
您也可以将此代码编码为
uint16_t tmp = ilk << 1;
ilk = (uint8_t)tmp + *(((uint8_t *)(&tmp))+1);
这个想法是&amp; tmp是一个指向tmp作为单词的指针。然后,强制转换将其转换为字节指针。将1添加到此指针会将其向上移动一个字节。取消引用它会提供tmp的高字节,该字节被添加到tmp。然后将结果分配给ilk获取此操作的低字节。我没有仔细检查但是如果编译器足够智能,它可以优化它以“将tmp的hi字节添加到tmp并仅获取结果的低字节”。
或者您可以将其实现为
ilk = ilk << 1 + (ilk >= (1 << sizeof(ilk));
在你的情况下
ilk = ilk << 1 + (ilk >= 128);
请注意,我的两个解决方案都不需要编译器优化几位的移位。
答案 2 :(得分:-1)
关闭我的头脑这应该工作,溢出位被丢弃
byte temp = ilk & 1;
ilk <<= 1;
ilk |= (temp >> sizeof(temp));