web-dev-qa-db-ja.com

(x&1)および(x >> = 1)とは何ですか?

「sizeof()関数を使用せずに、符号なし整数データ型のビット数を見つける」という割り当てを試みています。

そして、私の設計では、整数をビットに変換してからカウントします。例:10 is 1010および5 is 101

整数をビット表現に変換する は次のように表示されます。

do
{ 
    Vec.Push_back( x & 1 ) 
} 
while ( x >>= 1 );

貼り付けたものだけをコピーしたくありません。 F-10を使用すると、(x & 1)が何をしているのかわかりますが、それが名前であるか、それがどのように機能するのかわかりません(何かを比較しますか?)。また、>=は「より大きいか等しい」ことを知っていますが、x >>= 1とは何ですか?

注:マークされた重複はJavaScriptであり、C++ではありません

36
Sandra K

これらはBitwise Operatorsreference )です。

x & 1は、xの最下位ビットに応じて、1または0のいずれかの値を生成します。最後のビットが1の場合、x & 1の結果は1です。それ以外の場合は、0です。これはビット単位のAND演算です。

x >>= 1は、「xをそれ自体に1ビット右シフトして設定する」ことを意味します。式は、シフト後にxの新しい値に評価されます。

注:シフト後の最上位ビットの値は、符号なしタイプの値ではゼロです。符号付き型の値の場合、最上位ビットはsign extensionの一部としてシフトする前に値の符号ビットからコピーされるため、xが符号付きの場合、ループは終了しませんタイプ、および初期値は負です。

34
dasblinkenlight

x & 1x % 2と同等です。

x >> 1x / 2と同等です

したがって、これらは基本的に2で割った結果と残りです。

18
rama

「dasblinkenlight」の答えに加えて、例が役立つと思います。理解を深めるために8ビットのみを使用します。

x & 1は、xの最下位ビットに応じて、1または0のいずれかの値を生成します。最後のビットが1の場合、 x & 11です。それ以外の場合は、0です。これはビット単位のAND演算です。

これは、1がビットで00000001として表されるためです。最後のビットのみが1に設定されます。 x185であり、ビットで10111001として表されると仮定します。 x1を使用してビット単位のAND演算を適用すると、結果は次のようになります。

00000001
10111001
--------
00000001

演算結果の最初の7ビットは、演算後に0になり、この場合は情報を持ちません( 論理AND演算 を参照)。オペランドxの最初の7ビットが何であっても、操作後は0になるためです。ただし、オペランド1の最後のビットは1であり、オペランドxの最後のビットが0または1であったかどうかがわかります。したがって、この例では、xの最後のビットが1であるため、ビット単位のAND演算の結果は1になります。最後のビットが0だった場合、結果も0になり、オペランドxの最後のビットが0であることを示します。

00000001
10111000
--------
00000000

x >>= 1は、「xをそれ自体に1ビット右にシフトして設定する」ことを意味します。式は、シフト後にxの新しい値に評価されます

上記から例を選択しましょう。 x >>= 1の場合、これは次のようになります。

10111001
--------
01011100

そして、左シフトx <<= 1の場合:

10111001
--------
01110010

シフトに関するユーザー「dasblinkenlight」の注意に注意してください。

11
stackomatiker

x = (x >> 1)に似ています。

(operand1)(operator)=(operand2)  implies(=>)  (operand1)=(operand1)(operator)(operand2) 

Xのバイナリ値を1つ右にシフトします。

例えば。

int x=3;    // binary form (011) 
x = x >> 1; // zero shifted in from the left, 1 shifted out to the right:
            // x=1, binary form (001)
3
Satyendra Yadav

x&1は、xの最下位ビットに応じて1または0の値を生成します。最後のビットが1の場合、x&1の結果は1です。それ以外の場合は0です。これはビット単位のAND演算です。

x >> = 1は、「xを1ビット右にシフトしてそれ自体に設定」を意味します。式は、シフト後にxの新しい値に評価されます。

注:シフト後の最上位ビットの値は、符号なしタイプの値ではゼロです。符号付き型の値の場合、最上位ビットは符号拡張の一部としてシフトする前に値の符号ビットからコピーされるため、xが符号付き型で初期値が負の場合、ループは終了しません。

1
SACHIN DUHAN