[解決済み] なぜ (n & -n) == n ならば n は 2 のべき乗なのか?
2023-05-16 19:47:55
質問
if ((n & -n) == n) // i.e., n is a power of 2
// rest of the code
これはなぜでしょうか?
どのように解決するのですか?
記述が完全に正確でないのは
(0 & -0) == 0
が、0は2の累乗ではありません。 もっと良い言い方をすると
((n & -n) == n)
nが2の累乗、または2の累乗の負、または0であるとき。
n が 2 の累乗である場合、2 進法の n は 1 と 0 が続くものとなります。 -2 の補数の n は逆数 + 1 で、ビットはこのように並びます。
n 0000100...000
-n 1111100...000
n & -n 0000100...000
なぜこのような仕組みになっているかというと、2の補数とは逆数+1であると考えるからです。
-n == ~n + 1
n 0000100...000
inverse n 1111011...111
+ 1
two's comp 1111100...000
を足して2の補数を得るときに、1をずっと繰り越すので。
もしnが2の累乗以外だったら†、2の補数にはそのキャリーによって最高ビットが設定されないので、結果はビットが欠けることになります。
† - またはゼロまたは2のべき乗の負......冒頭で説明したとおりです。
関連
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] ArrayListの初期化を1行で行う。
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
Uncaught ReferenceError: は定義されていません。
-
強制型変換について
-
セミコロン期待値エラー解決
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
Java基礎 - マッピングとQ/A
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
-
[解決済み] ある数字が2の累乗かどうかを確認する方法