Javaの2進数
1. 序章
2進数システムは、0と1を使用して数値を表します。 コンピューターは2進数を使用して、任意のデータを格納および操作します。
このチュートリアルでは、2進数を10進数に、またはその逆に変換する方法を学習します。 また、それらに足し算と引き算を行います。
2. バイナリリテラル
Java7はバイナリリテラルを導入しました。 2進数の使用を簡素化しました。
これを使用するには、番号の前に0Bまたは0bを付ける必要があります。
@Test
public void given_binaryLiteral_thenReturnDecimalValue() {
byte five = 0b101;
assertEquals((byte) 5, five);
short three = 0b11;
assertEquals((short) 3, three);
int nine = 0B1001;
assertEquals(9, nine);
long twentyNine = 0B11101;
assertEquals(29, twentyNine);
int minusThirtySeven = -0B100101;
assertEquals(-37, minusThirtySeven);
}
3. 2進数変換
このセクションでは、2進数を10進数形式に、またはその逆に変換する方法を学習します。 ここでは、最初に組み込みのJava関数を使用して変換し、次にそのカスタムメソッドを記述します。
3.1. 10進数から2進数
Integer には、 toBinaryString という名前の関数があり、10進数をそのバイナリ文字列に変換します。
@Test
public void given_decimalNumber_then_convertToBinaryNumber() {
assertEquals("1000", Integer.toBinaryString(8));
assertEquals("10100", Integer.toBinaryString(20));
}
これで、この変換のための独自のロジックを作成してみることができます。 コードを書く前に、まず10進数を2進数に変換する方法を理解しましょう。
10進数nをバイナリ形式に変換するには、次のことを行う必要があります。
- n を2で割り、商qと余りrに注意してください。
- q を2で割り、その商と余りに注意してください
- 商として0が得られるまで、手順2を繰り返します。
- 残りのすべてを逆の順序で連結します
6を同等のバイナリ形式に変換する例を見てみましょう。
- まず、6を2で割ります。商3、余り0
- 次に、3を2で割ります。商1、余り1
- そして最後に、1を2で割ります。商0、余り1
- 110
上記のアルゴリズムを実装してみましょう。
public Integer convertDecimalToBinary(Integer decimalNumber) {
if (decimalNumber == 0) {
return decimalNumber;
}
StringBuilder binaryNumber = new StringBuilder();
Integer quotient = decimalNumber;
while (quotient > 0) {
int remainder = quotient % 2;
binaryNumber.append(remainder);
quotient /= 2;
}
binaryNumber = binaryNumber.reverse();
return Integer.valueOf(binaryNumber.toString());
}
3.2. 2進数から10進数
バイナリ文字列を解析するために、IntegerクラスはparseInt関数を提供します。
@Test
public void given_binaryNumber_then_ConvertToDecimalNumber() {
assertEquals(8, Integer.parseInt("1000", 2));
assertEquals(20, Integer.parseInt("10100", 2));
}
ここで、parseInt関数は入力として2つのパラメーターを取ります。
- 変換されるバイナリ文字列
- 入力文字列を変換する必要がある記数法の基数または基数
それでは、2進数を10進数に変換する独自のロジックを作成してみましょう。
- 右端の数字から始めます
- 各桁にその桁の2^{position}を掛けます–ここでは、右端の桁の位置はゼロであり、左側に移動すると増加します
- すべての乗算の結果を加算して、最終的な10進数を取得します
繰り返しになりますが、実際のメソッドを見てみましょう。
- まず、101011 =(1 * 2 ^ 5)+(0 * 2 ^ 4)+(1 * 2 ^ 3)+(0 * 2 ^ 2)+(1 * 2 ^ 1)+(1 * 2 ^ 0 )。
- 次に、101011 =(1 * 32)+(0 * 16)+(1 * 8)+(0 * 4)+(1 * 2)+(1 * 1)
- 次に、101011 = 32 + 0 + 8 + 0 + 2 + 1
- そして最後に、101011 = 43
最後に、上記の手順をコーディングしましょう。
public Integer convertBinaryToDecimal(Integer binaryNumber) {
Integer decimalNumber = 0;
Integer base = 1;
while (binaryNumber > 0) {
int lastDigit = binaryNumber % 10;
binaryNumber = binaryNumber / 10;
decimalNumber += lastDigit * base;
base = base * 2;
}
return decimalNumber;
}
4. 算術演算
このセクションでは、2進数の算術演算の実行に集中します。
4.1. 添加
10進数の加算と同じように、右端の桁から数値の加算を開始します。
2桁の2桁を追加するときは、次の規則を覚えておく必要があります。
- 0 + 0 = 0
- 0 + 1 = 1
- 1 + 1 = 10
- 1 + 1 + 1 = 11
これらのルールは次のように実装できます。
public Integer addBinaryNumber(Integer firstNum, Integer secondNum) {
StringBuilder output = new StringBuilder();
int carry = 0;
int temp;
while (firstNum != 0 || secondNum != 0) {
temp = (firstNum % 10 + secondNum % 10 + carry) % 2;
output.append(temp);
carry = (firstNum % 10 + secondNum % 10 + carry) / 2;
firstNum = firstNum / 10;
secondNum = secondNum / 10;
}
if (carry != 0) {
output.append(carry);
}
return Integer.valueOf(output.reverse().toString());
}
4.2. 減算
2進数を引く方法はたくさんあります。 このセクションでは、減算を行うための1の補数法を学習します。
まず、数の補数が何であるかを理解しましょう。
数の補数は、によって得られる数です。
public Integer getOnesComplement(Integer num) {
StringBuilder onesComplement = new StringBuilder();
while (num > 0) {
int lastDigit = num % 10;
if (lastDigit == 0) {
onesComplement.append(1);
} else {
onesComplement.append(0);
}
num = num / 10;
}
return Integer.valueOf(onesComplement.reverse().toString());
}
1の補数を使用して2つの2進数を減算するには、次のことを行う必要があります。
- 減数sの1の補数を計算します
- sと被減数を追加します
- ステップ2でキャリーが生成された場合は、そのキャリーをステップ2の結果に追加して、最終的な答えを取得します。
- ステップ2でキャリーが生成されない場合、ステップ2の結果の1の補数が最終的な答えになります。 しかし、この場合、答えは否定的です
上記の手順を実装しましょう。
public Integer substractBinaryNumber(Integer firstNum, Integer secondNum) {
int onesComplement = Integer.valueOf(getOnesComplement(secondNum));
StringBuilder output = new StringBuilder();
int carry = 0;
int temp;
while (firstNum != 0 || onesComplement != 0) {
temp = (firstNum % 10 + onesComplement % 10 + carry) % 2;
output.append(temp);
carry = (firstNum % 10 + onesComplement % 10 + carry) / 2;
firstNum = firstNum / 10;
onesComplement = onesComplement / 10;
}
String additionOfFirstNumAndOnesComplement = output.reverse().toString();
if (carry == 1) {
return addBinaryNumber(Integer.valueOf(additionOfFirstNumAndOnesComplement), carry);
} else {
return getOnesComplement(Integer.valueOf(additionOfFirstNumAndOnesComplement));
}
}
5. 結論
この記事では、2進数を10進数に、またはその逆に変換する方法を学びました。 次に、2進数の加算や減算などの算術演算を実行しました。
この記事で使用されている完全なコードは、GitHubから入手できます。