2進法で3で割る割り切れる規則があるかどうかを知りたいです。
たとえば、10 進数では、数字の合計が 3 で割られる場合、その数は 3 で割られます。たとえば、15 -> 1+5 = 6 -> 6
は 3 で割られるので、15 は 3 で割られます。
理解しておくべき重要なことは、私がそうするコードを探しているのではないということです。bool flag = (i%3==0); は私が探している答えではありません。私は、10 進法則のように人間が簡単に実行できるものを探しています。
ベストアンサー1
このウェブサイトを参照してください:2進数が3で割り切れるかどうかを知る方法
基本的に、ゼロでない奇数ビットとゼロでない偶数ビットの数を数えます。右からそれらの差が 3 で割り切れる場合、その数は 3 で割り切れます。
例えば:
15 = 1111
2 つの奇数ビットと 2 つの偶数ビットが非ゼロです。差は 0 です。したがって は15
で割り切れます3
。
185 = 10111001
これには 2 つの奇数の非ゼロビットと 3 つの偶数の非ゼロビットがあります。差は 1 です。したがって は185
で割り切れません3
。
説明
値について考えてみましょう2^n
。 は と合同であること2^0 = 1
が分かっています1 mod 3
。したがって はを法2^1 = 2
として合同です。2*1 = 2
このパターンを続けると、2^n
n が奇数の場合は と2^n
合同であり1 mod 3
、偶数の場合 は と合同であり、2 mod 3
これは です-1 mod 3
。したがって はを法として10111001
合同であり1*1 + 0*-1 + 1*1 + 1*-1 + 1*1 + 0*-1 + 0*1 + 1*-1
、これは と合同です1 mod 3
。したがって 185 は 3 で割り切れません。