オーバーフローがある場合はラップアラウンドして、Javaで一緒に2つのバイトを追加する方法

accountantToDev:

私はすべての単一バイトのチェックサムとして結果を格納し、1の補数2進加算を使用してASCII文字のみで構成されるバイト配列内のバイトまで追加する必要があります。

私は一緒にちょうど2バイトを追加しますが、2つのバイナリ値を追加するとき、余分なビットがある場合は、「ラップアラウンド」する方法見当がつかないする方法を考え出すことにより、基本から始めしようとしています。

私は別の値で遊ぶことができますので、私はテスターのプログラムを作りました。以下の例では、私は、それぞれが進値255を表す、2つの2進数を追加しようとしています。

byte b1 = (byte) 255;
String s1 = String.format("%8s",Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0');
System.out.println("byte 1: " + s1); // 1111111

byte b2 = (byte) 255;
String s2 = String.format("%8s",Integer.toBinaryString(b2 & 0xFF)).replace(' ', '0');
System.out.println("byte 2: " + s2); // 1111111

byte sum = 0;

sum += b1;
sum += b2;

String s3 = String.format("%8s", Integer.toBinaryString(sum & 0xFF)).replace(' ', '0');
System.out.println("sum of byte 1 and byte 2: " + s3); // should be 1111111

私は、出力があることが予想しました:

バイト1:11111111
バイト2:11111111
バイト1とバイト2の合計:11111111

しかし、実際の出力は次のようになります。

バイト1:11111111
バイト2:11111111
バイト1とバイト2の合計:11111110

私は、正しい結果を得るように、どのように私は、余分なビットをラップアラウンドしますか?

ジェイコブG.:

あなただけで作業しているのでbyte、次のような大きなプリミティブ型、中にあなたの加算結果を格納することができますintこれにより、あなたはに簡単にアクセスがありますオーバーフロービットを使用すると、(ビット単位演算を使用して)を抽出し、既存の合計に追加することができ、:

int sum = b1 + b2;
sum += (sum >> 8) & 1;
String s3 = String.format("%8s", Integer.toBinaryString(sum & 0xFF)).replace(' ', '0');
System.out.println("sum of byte 1 and byte 2: " + s3); // should be 11111111

値ならばオーバーフロービットがあり0、その後、何も起こりません。それはだ場合でも1、オーバーフローが発生し、ビットがラップアラウンドします。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=188947&siteId=1