したがって、これは可能であり、ビットごとの操作とマスクは非常に役立つと言われていますが、それらがどのように機能するかについて何かが欠けているに違いありません。
数値、たとえば x が y の倍数かどうかを計算しようとしています。x が y の倍数である場合、それ以外の場合は、x を増やして、x よりも大きい y の最も近い倍数に到達させたいと考えています (すべての x が結果に収まるように)。C の学習を始めたばかりで、これらのタスクのいくつかを理解するのに苦労しています。
これが私が試したものですが、5、9、または24などの数字を入力すると、それぞれ0、4、4が得られます。
if(x&(y-1)){ //if not 0 then multiple of y
x = x&~(y-1) + y;
}
説明、舞台裏で行われている数学の例は大歓迎です。
編集:明確にするために、アイテムが倍数であるかどうかを取得するためのビットのシフトをある程度理解しています。(返信で説明したように、10100 は 101 の倍数であり、シフトされたばかりです)。16 が 10000 の場合、その補数は 01111 です。この補数を使用して、項目が 16 の倍数かどうかを確認するにはどうすればよいでしょうか? また、誰かが上記のコードの数値的な説明を与えることができますか? これを表示すると、なぜ機能しないのかを理解するのに役立つかもしれません。うまくいかない理由がわかれば、自分で問題を解決できると思います。