bitClearは最上位ビットでは動作しません

私は現在、私が32ビットシーケンスを読むプロジェクトに取り組んでいます。 シーケンスが受信されないとき、digitalPinは常にHIGHで、シーケンスが開始されると約1kHzでオシレーションを開始します( RC5 )。

私は、どの信号がdigitalPinにあるかに応じてuint32_tのビットを設定し、クリアしています。 MSB以外のすべてのビットでうまく動作しているようです。

私が何を意味するのかを示す短いコードスニペット:

const short irPin = 8;
const short msgDelay = 250;

uint32_t data = 0xFFFFFFFF;
long msgArrived = 0;

void setup(){
  Serial.begin(115200);
  pinMode(irPin, INPUT);
}

void loop(){
  long now = millis();

  if( (!(PINB & 1)) && ((now - msgArrived)> msgDelay)){
    msgArrived = millis();
    bitClear(data, 31);

    Serial.println(data, BIN);
  }
}

これは私に

11111111111111111111111111111111

私はすでに試した

bitClear(data, 32); -> 11111111111111111111111111111111
bitClear(data, 30); -> 10111111111111111111111111111111

ですから、すべての出力は正しいですが、msbをクリアしようとしたときは出力されません。

誰も同じような行動を経験していますか?

4
あなたが data&=〜(0x1 << 31)で "手動で"作成するとうまくいくのですか?
追加された 著者 mchlfchr,
bitClear(データ、31); uint32_tのmsbでなければなりません。 bitClear()は0からsizeof(uint32_t)-1になります。そして、bitClear(data、32);文書が私に嘘をついた場合にのみ私は試みました。
追加された 著者 Seamus Warren,
はい、これは動作しますが、BrettAMの答えを見てください。 println()は先行ゼロを表示しません。
追加された 著者 Seamus Warren,

1 答え

uint32_t data = 0xFFFFFFFF;
Serial.println(data, BIN);
data = 0xFFFFFFFF;
bitClear(data, 30);
Serial.println(data, BIN);
data = 0xFFFFFFFF;
bitClear(data, 31);
Serial.println(data, BIN);

私のメガ・アウトプットでは:

11111111111111111111111111111111
10111111111111111111111111111111
1111111111111111111111111111111

あなたはprintlnが1の数字だけの先頭の0を印刷しないという事実を誤解していませんか? 16進数で印刷すると、すべての数値が同じ幅になります。

FFFFFFFF
BFFFFFFF
7FFFFFFF
6
追加された
実際、私は実際にprintlnが先行ゼロを印刷しないという事実を逃しました。ありがとう。 +1になるだろうが、私はそれについての評判が足りない。
追加された 著者 Seamus Warren,