「sizeof()関数を使用せずに、符号なし整数データ型のビット数を見つける」という割り当てを試みています。
そして、私の設計では、整数をビットに変換してからカウントします。例:10 is 1010
および5 is 101
整数をビット表現に変換する は次のように表示されます。
do
{
Vec.Push_back( x & 1 )
}
while ( x >>= 1 );
貼り付けたものだけをコピーしたくありません。 F-10を使用すると、(x & 1)
が何をしているのかわかりますが、それが名前であるか、それがどのように機能するのかわかりません(何かを比較しますか?)。また、>=
は「より大きいか等しい」ことを知っていますが、x >>= 1
とは何ですか?
注:マークされた重複はJavaScriptであり、C++ではありません
これらはBitwise Operators( reference )です。
x & 1
は、x
の最下位ビットに応じて、1
または0
のいずれかの値を生成します。最後のビットが1
の場合、x & 1
の結果は1
です。それ以外の場合は、0
です。これはビット単位のAND演算です。
x >>= 1
は、「x
をそれ自体に1ビット右シフトして設定する」ことを意味します。式は、シフト後にx
の新しい値に評価されます。
注:シフト後の最上位ビットの値は、符号なしタイプの値ではゼロです。符号付き型の値の場合、最上位ビットはsign extensionの一部としてシフトする前に値の符号ビットからコピーされるため、x
が符号付きの場合、ループは終了しませんタイプ、および初期値は負です。
x & 1
はx % 2
と同等です。
x >> 1
はx / 2
と同等です
したがって、これらは基本的に2で割った結果と残りです。
「dasblinkenlight」の答えに加えて、例が役立つと思います。理解を深めるために8ビットのみを使用します。
x & 1
は、x
の最下位ビットに応じて、1
または0
のいずれかの値を生成します。最後のビットが1
の場合、x & 1
は1
です。それ以外の場合は、0
です。これはビット単位のAND演算です。
これは、1
がビットで00000001
として表されるためです。最後のビットのみが1
に設定されます。 x
が185
であり、ビットで10111001
として表されると仮定します。 x
に1
を使用してビット単位の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」の注意に注意してください。
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)
x&1は、xの最下位ビットに応じて1または0の値を生成します。最後のビットが1の場合、x&1の結果は1です。それ以外の場合は0です。これはビット単位のAND演算です。
x >> = 1は、「xを1ビット右にシフトしてそれ自体に設定」を意味します。式は、シフト後にxの新しい値に評価されます。
注:シフト後の最上位ビットの値は、符号なしタイプの値ではゼロです。符号付き型の値の場合、最上位ビットは符号拡張の一部としてシフトする前に値の符号ビットからコピーされるため、xが符号付き型で初期値が負の場合、ループは終了しません。