2

私はビット演算の完全な初心者であり(Cでもあまり経験がありません)、次の式にぶつかりました。

x |= (1<<y)

最初は、「xはxに等しいか、yはビット単位で左にシフトされている」という意味だと思っていましたが、次のようになることに気付きました。

x |= (y<<1)

最後に、「xはxに等しいか、1をyビット左にシフトした」という意味だと思いましたが、その1が8ビットレジスタのどこにあるのかわかりません。00000001という意味ですか?となることによって:

a = 2
b = 1<<a // so b=00000010

誰かがこのステートメントの正しい意味を教えてもらえますか?また、誰かがビット単位の構文を説明する良いリンクを持っているなら、私は感謝するでしょう。ありがとう。


私の友人は、先日彼が取り組んでいたAllJoynライブラリを利用したAndroidプロジェクトのデモを行いました。AllJoynは、Wifi-directおよびその他のワイヤレスプロトコルをサポートするオープンソースAPIであり、Android、Linux、およびiOSでサポートされています。調べる価値があるかもしれません。

https://www.alljoyn.org/

4

2 に答える 2

2
x |= ...

の省略形です

x = x | ...

x | ...の値をに割り当てますx

1 << y

によって1左シフトされyます。例えば

00000001 << 1 -> 00000010

それで、

x |= (1 << y)

OR x左に1シフトされた状態yxです(そして結果をに割り当てます)。
つまり、のy番目のビットをxに設定し1ます。

x = 01010101
x |= (1 << 1)   -> 01010111  (it set the 2nd bit to 1)
于 2013-02-16T19:37:31.273 に答える
1

最初のステートメントは、バイナリ表現の 1 (0b0000001) を y ビット左シフトすることを意味します。次に、値と X の OR をとります。2 番目のステートメントの仮定は正しいです。3 番目のステートメントは 4 (0b0000000100) を返します。ビット操作のセマンティクスに関して、C 標準では、2 のべき乗の昇順の値で 2 進数が右から左に読み取られるように、表現されるすべてのビット操作が定義されています。エンディアンや 2 つの補数などについて心配する必要はありません。コンパイラがそれを処理します。あなたのために。したがって、(0b00100) = 4、(0b000010) = 2、(0b00001) = 1 などとなります。

于 2013-02-16T19:46:35.803 に答える