元の質問の明示的な質問(CHAR_BITとは)と暗黙の質問(これはどのように機能するか)の両方に回答しようとします。
CおよびC ++の文字は、Cプログラムがアドレス指定できるメモリの最小単位を表します*
CおよびC ++のCHAR_BITは、charのビット数を表します。char型に関する他の要件のため、常に少なくとも8でなければなりません。実際には、すべての現代の汎用コンピューターでは正確に8ですが、一部の歴史的または専門的なシステムはより高い値を持つ場合があります。
JavaにはCHAR_BITやsizeofに相当するものはありません。Javaのすべてのプリミティブ型はサイズが固定されており、オブジェクトの内部構造はプログラマにとって不透明なので、Javaには必要ありません。このコードをJavaに変換する場合は、「sizeof(int)* CHAR_BIT-1」を固定値31に置き換えるだけです。
この特定のコードでは、intのビット数を計算するために使用されています。この計算では、int型にパディングビットが含まれていないことを前提としています。
コンパイラが符号付き数値のビットシフトで符号拡張することを選択し、システムが負の数値に2の補数表現を使用すると仮定すると、「MASK」は正またはゼロの値の場合は0、負の値の場合は-1になります。
2の補数を否定するには、ビット単位の否定を実行してから1を追加する必要があります。同等に、1を減算してから、ビットごとに否定できます。
ここでも、2の補数表現-1はすべて1で表されると想定しているため、排他的または-1付きはビット単位の否定と同等です。
したがって、vが0の場合、数値はそのままになり、vが1の場合、無効になります。
注意すべきことは、CおよびC ++の符号付きオーバーフローは未定義の動作であることです。したがって、最も負の値でこのABS実装を使用すると、未定義の動作が発生します。これは、プログラムの最終行がunsigned intで評価されるようにキャストを追加することで修正できます。
*これは、ハードウェアがアドレス指定できるメモリの最小単位と同じですが、必ずしも必要ではありません。実装は、ハードウェアアドレス可能なメモリの複数のユニットを1つのプログラムアドレス可能なメモリに組み合わせるか、1つのユニットのハードウェアアドレス可能なメモリをプログラム可能なメモリの複数のユニットに分割することができます。