JavaRush /Java Blog /Random-JA /Java: ビットとバイト
Viacheslav
レベル 3

Java: ビットとバイト

Random-JA グループに公開済み
Java: ビットとバイト - 1

導入

人間が 10 進法で数を数えるなら、コンピュータは 2 進数システムで数を数えます。また、プログラマーは、人間とコンピューターの両方と対話する方法を理解する必要があります。このレビューはこの問題に役立つはずです。時には、明白なものの背後に世界全体が隠されていることがあります。この世界について話そうと提案します。たとえば、1週間は7日です。では、質問に答えてみましょう。数字の「7」は何ですか? ) まず、整数(正)の自然数です。これも 10 進数です。 10 進数は、 10 進法における数値です。「10 進法」というときは、その記数法が10 を基数とすることを意味します。基数は、特定の記数法で数値を表すために使用できる桁数を示します。カウントダウンはゼロからです。したがって、10 進法で数値を表すには、0 から 9 までの数値を使用します。これは良いのですが、9 までだけでなく、それ以降も数える必要があります。どうすればいいですか?たとえば、数字の 10 です。この数字を書くには、2 桁もの数字を使用します。10 進法における各桁の位置を小数点といいます。数字は右から左に数えられます。
Java: ビットとバイト - 2
さらに、10 進数は次のように展開できます: 103 = 1*10^2 + 0*10^1 + 3*10^0
Java: ビットとバイト - 3
数字は基本的に右から左に増加します。つまり、最初は 7 でしたが、その後 10 になりました。したがって、桁は 0 から右に数えられます。これは一体何のためにあるのでしょうか?それは、私たちはコンピューターではないからです。また、私たちは 10 進数 (つまり、10 進数) で数えますが、コンピューターは 2 進数 (つまり、2 進数) で数えます。ただし、これらの番号体系に適用されるルールは同じです。
Java: ビットとバイト - 4

バイナリーシステム

2 進法は 10 進法とよく似ていますが、唯一の違いは、制限が 10 ではなく 2 であることです。例と比較してみましょう。11 を 2 進数で表すにはどうすればよいでしょうか? それは非常に簡単です。10 進数を基数 2 で割るだけです。つまり、列内の 11/2 を数えるだけです。例:
Java: ビットとバイト - 5
または、WikiHow の例を次に示します。
Java: ビットとバイト - 6
興味深いことに、10 進数と同じ方法で 2 進数でも数値を表すことができます。 2 進数の 111 = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java: ビットとバイト - 7
2 進数から 10 進数への変換の例は、オンライン計算機で見ることができます。数体系の演算規則が同じであるという事実について、二進数体系における加算を見てみましょう。
Java: ビットとバイト - 8
ご覧のとおり、加算中に 10 進法と同じ方法で数字を転送します。加算の分析は、たとえばここで見ることができます。 ところで、「放電」という言葉が定期的に出てきます。で、それ何? 場所は数字を表す「構造要素」にすぎません。つまり、数字 10 は 2 桁で構成されています。この数字を記述するには、2 桁、2 桁、2 つの要素が必要です。2 進数システムでは 1 桁が bit であるため、これを理解することが重要です。ビットという言葉は、英語の「binary digit」、つまり 2 進数に由来します。0 または 1 のいずれかになります。しかし、私たちが数字や単語を 1 文字ずつではなく全体として読み取るのと同じように、コンピューターは一度に 1 ビットずつ読み取るわけではありません。RAM 内の処理された情報の最小「部分」 (いわゆる、アドレス指定可能な情報の最小単位)については、 8 ビットのシーケンスが読み取られます。8 個あるので、これを「オクテット」と呼びます。そして、よりよく知られている言葉であるByte。オクテットを覚えるには、タコ (8 本の足) という単語が英語に訳すと octopus であることを覚えておいてください。つまり、ここにはタイトルにあるのとまったく同じ「octo」が含まれています。
Java: ビットとバイト - 9
8 ビットで表現できる最大の数はいくらか考えてみましょう。
Java: ビットとバイト - 10
ここで、負の数はどうなるのかという疑問が生じます。これを理解するために、Java でバイトがどのように表現されるかについて話しましょう。
Java: ビットとバイト - 11

Javaとバイト

Java では負の数をどのようにして使用できるのでしょうか? 簡単に完了します。Java では、バイトは署名されます。左端の桁/ビット (「最上位ビット」とも呼ばれます) は、「この数値は負ですか?」という質問に答える一種の「マーカー」となります。答えが「はい」の場合、マーカーの値は 1 になります。そうでない場合は、0 になります。数値 5 を負の数値 5 に変換する方法の例を見てみましょう。
Java: ビットとバイト - 12
この図に基づいて、バイト値の制限が理解できます。
Java: ビットとバイト - 13
また、次のことも明らかです。
  • 127 に 1 を加えると、-128 になります。
  • -128 から 1 を引くと 127 になります。
したがって、Java の Byte は -128 から 127 までの値を取ることができます。覚えているように、バイトはオクテットです。また、最大桁/最上位ビットは 0 から数えるので、シリアル番号は 7 になります。この場合、バイトは -2 の 7 乗 (下限) から 2 の 7 乗 - 1 (上限) に等しいことを覚えておくと簡単です。データ型自体の操作は簡単です。この記事では、オンライン Java コンパイラー「repl.it」を「サンドボックス」として使用します。https://repl.it/言語/java。たとえば、バイナリ形式のバイト変数を文字列として表すコードを実行してみましょう。
class Main {
  public static void main(String[] args) {
    byte octet = 5;
    String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
    System.out.println(bin);
  }
}
バイトの操作は、I/O ストリームを操作するときに積極的に使用されます。詳細については、Oracle のチュートリアル「I/O Streams」を参照してください。さらに、Java では、特別なリテラルを使用して値をビットとして指定できます。
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java: ビットとバイト - 14

ビット操作

バイトとビットに触れると、さまざまなビット操作についても触れずにはいられません。おそらく最も一般的な操作はシフト (ビット単位のシフトまたはビット シフト) です。それはすべて、その結果に明らかな実用的な利点があるからです。使用は何ですか?N 桁左にシフトすることは、数値を 2N で乗算することと同じです。そして、右へのシフトは同じ除算に似ています。つまり、 5<<2 == 5*Math.pow(2,2) です。なぜそうなるのかを理解するために、この例をさらに詳しく見てみましょう。
Java: ビットとバイト - 15
ビット単位の否定 NOT (単項ビット単位) はチルダで表され、ビットを反転します。これは、~5 のようにチルダで記述されます。
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
これは、Java が数値の符号を変更するときに、最後にビット値を反転することに加えて、+1 を実行することをもう一度示しています。そして、これがなければ、ご覧のとおり、数字の5は変わります。そして、符号を変更する前と同じ数値を維持するには、+1 を実行する必要があります。ビットごとの AND を使用すると、すべてのビットの値が 1 である場合にのみ、2 つの異なる数値をそのビットの間だけ値 1 のままにすることができます。これについて興味深いのは、アプリケーションにいくつかの利点があることです。
int x=4;
System.out.println((x&1) != 1);
このコードは、数値 x のパリティをチェックします。例を見てみましょう:
Java: ビットとバイト - 16
ビットごとの AND とビットごとの OR を一緒に使用すると、マスクを使用できます。
public static void main(String[] args) {
    byte optionA=0b0100;
    byte optionB=0b0010;
    byte optionC=0b0001;
    byte value = (byte)(optionB | optionC);
    // Check for optionB
    if ((optionC & value) != 0b0000) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
詳細については、 「 Java のビット演算子を使用したマスキング オプション」を参照してください。ビット操作は興味深いトピックであり、それに関して別のレビュー、記事、書籍が書かれています。そしてここから、暗号化への長い道のりが始まります。このレビューの一環として、それがなぜ機能するのか、またどのように機能するのかを理解することは価値があります。ビット操作の詳細については、tproger のレビュー「ビット操作について」を読むことをお勧めします。

プリミティブ型

したがって、バイトはオクテット、つまり 8 ビットです。偶然ですが、Java にも 8 つのプリミティブ型があることを覚えておくのは簡単です。プリミティブ型は、プログラミング言語に組み込まれている、つまりデフォルトで使用できるデータ型です。byte は、Java が使用できるメモリ フットプリントの点で最小のプリミティブ データ型です。前に述べたように、1 バイトは 8 ビットを占めます。したがって、最上位桁は 7 です。したがって、バイトには、結果の -2 の 7 乗から 2 の 7 乗マイナス 1 までの値が含まれます。他にどのようなプリミティブ型があるか:
Java: ビットとバイト - 17
表からわかるように、占有されるデータ量の点でデータ型が 2 倍になります。つまり、short = 2 * バイト、int = 2 * short です。実は覚えやすいんです。バイト = 8 ビットであることに注意してください。それを下回ることはできないという事実も思い出されます。英語では整数のことを integer と言います。そのプリミティブ型は、略語 int と呼ばれていました。通常の整数 int があります。ショートバージョンのショートとロングバージョンのロングがあります。したがって、int は 32 ビット (4 バイト) を占有します。ショート バージョンは 2 倍小さい 16 ビット (2 バイト)、ロング バージョンは 2 倍の大きさです。64 ビット (8 バイト)。したがって、int は最大で約 20 億の数値を保存できます。そして、long は最大約 9,000 兆個 (素晴らしい言葉です) を保存できます。初心者のプログラマは 1 キロバイトが 1000 バイトであると考え、熟練したプログラマは 1 キログラムが 1024 グラムであると考えるという古いジョークを思い出してみると、次のことが理解できます。
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
ところで、注意深い読者なら、写真には 7 種類しかないことに気づいたかもしれません。8 プリミティブ型はブール型です。boolean は、true と false の 2 つの値のみを持つブール データ型です。しかし、疑問が生じます - サイズはどれくらいですか? Java 仮想マシンの仕様とセクション「2.3.4. ブール型」で次のように答えられます。
Java: ビットとバイト - 18
つまり、boolean だけでも int と同じ量が必要になります。ブール値の配列を宣言すると、配列の各要素は 1 バイトを占有します。これらは本当に奇跡です:)

結論

統合するために、さらにいくつかの資料を理解しておくことをお勧めします。 #ヴィアチェスラフ
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION