ビットごとのロジックを使用して気の利いたモジュラー算術演算を実行する C スニペットに出くわしました。
int a,b,c;
c = (a + b - 1) & (- b) +b;
c の値は、a+b より大きい b の最小倍数です (John Bollinger の回答に応じて編集)。私はこれがどのように機能するかを自分自身に説明しようとしています (剰余算術と & 演算がどのように関連している可能性があるかについてはほとんど理解していません) が、洞察が不足しています。一方、私はそれを次のように表現できるようです
c = (a+b) - ((a+b)%b) + (((a+b)%b)?b:0)
この表現はわかりやすい。しかもモジュラーの登場とは?操作は、個々の部分をビットごとのロジックとして表現し、何らかの方法で上部の式に還元できることを示唆しています。しかし、どのように?誰かが試してみたい場合は、演習として残します (これは宿題ではありません)。実装は C である必要はありません。これを説明するオンライン参照がある場合は、それを提供しても構いませんが、完全な回答にはなりません。下から上の表現への移行を明確なステップで見たいです...
コメント このリンクは、b が 2の累乗である場合に適用される可能性があることを示唆しています。
式で、を に置き換えることができると仮定します。ここで、は表現...&(-b)
で可能な int の総数です。 (-b)
(nums(int)-b)
nums(int)
好みのコンパイラ/C バージョンを自由に指定してください。
サンプルコード:
int a,b,c;
int alow, ahigh;
b = 16;
alow = 8;
ahigh = 20;
printf("a+b c lcm(a+b,b) + ?b \n");
for (a=alow;a<ahigh;a++) {
c = ((a+b-1) & (-b)) +b;
printf("%5d %5d %5d \n",a+b, c, (a+b) - ((a+b)%b) + (((a+b)%b)?b:0) );
}
出力例:
a+b c lcm(a+b,b) + ?b
24 32 32
25 32 32
26 32 32
27 32 32
28 32 32
29 32 32
30 32 32
31 32 32
32 32 32
33 48 48
34 48 48
35 48 48