2

シフト レジスタを使用して 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 のような演算子はありますか?

4

3 に答える 3

4

<<「左回転」演算子ではないためです。算術左シフト演算子です。次のようなものを使用できます

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

代わりは。sizeof(n) * CHAR_BIT - b使用する整数型のサイズに依存しないようにする場合は、ビットごとの OR 演算子の右側に書き込みます。

于 2013-05-28T19:06:49.577 に答える
1

これを次のようにコーディングすることもできます

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

&tmp は単語としての tmp へのポインタであるという考え方です。次に、キャストはそれをバイト ポインターに変換します。このポインターに 1 を加算すると、1 バイト上に移動します。逆参照すると、tmp に追加される tmp の上位バイトが提供されます。次に、結果をilkに割り当てると、この操作の下位バイトが取得されます。私は再確認しませんでしたが、コンパイラが十分にスマートであれば、これを最適化して「tmp の hi バイトを tmp に追加し、結果の下位バイトのみを取得する」ことができます。

または、次のように実装できます

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

あなたの場合

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

私のソリューションは両方とも、コンパイラが数ビットのシフトを最適化する必要がないことに注意してください。

于 2013-05-28T19:39:08.593 に答える
-1

私の頭の上から、これはうまくいくはずです、オーバーフロービットは破棄されます

byte temp = ilk & 1;
ilk <<= 1;
ilk |= (temp >> sizeof(temp));
于 2013-05-28T19:07:58.953 に答える