私はK & R Cプログラミング言語、 第2章、2.10で、運動2-9を理解していない:K&R Cプログラミング言語演習2-9
エクササイズ2-9。 2の補数システムでは、x & =(x-1)はxの右端の1ビットを削除します。理由を説明。この観測を使用して、より高速なバージョンのビットカウントを作成します。
BITCOUNT関数である:それはビット1であり、最後のビットにポップ場合
/* bitcount: count 1 bits in x */
int bitcount(unsigned x)
{
int b;
for (b = 0; x != 0; x >>= 1)
if (x & 01)
b++;
return b;
}
機能が確認した後、右端のビットを削除します。
なぜx&(x-1)
が右端の1ビットを削除するのか理解できませんか? 例えば、xが1010
であり、x-1がバイナリで1001
であり、x&(x-1)
が1011
であるとすると、右端のビットはそこにあり、1となるでしょう。
また、練習問題には2の補数が記載されていますが、この質問とは何か関係がありますか?
ありがとうございました!!!
'1001&1010'は' 1011'ありません。あなたはバイナリを考えています。バイナリではありません。 – tkausl
"1011"は、 "1010"と "1001"の論理OR( '|')です(結果は各位置で '1 'になります) 1つは* OR *もう1つは) 「論理AND」(&)は「1000」である。 – greybeard
コードスニペットをフォーマットしてください(字下げしてください)。 – greybeard