# JAVAカスタム暗号化アルゴリズム(1)

# JAVAカスタム暗号化アルゴリズム(1)
###　1.基本知　　
>1. ビットとバイトの関係
>    - 1)ビットは、メモリ内の最小のストレージユニットであり、0または1のいずれかです.  
>    - 2)1バイト= 8ビット  
>    - 3)バイトはJavaで最小のストレージユニットです.  
>2. メモリ内のint型の格納方法[(サンプル)](#jump1)：  
>    - Javaのint型の長さは32ビットです  
>    - 最上位ビットは符号ビットです.1は負の数を意味し、0は正の数を意味します.  
>    - したがって、Javaのint型の値の範囲は(- 2 ^ 31)〜(2 ^ 31)です.  
>    - 数値は2の補数の形でメモリに保存されます.  
>3. バイナリの基本的な知識  
>    - 元の数の場合、最上位ビットは符号ビットであり、残りのビットは数値の絶対値の2進数です.  
>    - シフト操作「>>」、右シフト.   
>    - ビット単位のANDで「&」を計算します.2つのビットが同時に1の場合、結果は1になり、それ以外の場合は0になります.  

###　2.int型をbyte []型に変換する方法  
>1. 一致する長さのバイト配列を作成します  
>     - 1バイト= 8ビット  
>     - intの長さは32ビット、バイトの長さは8ビット  
>     - したがって、byte[4]はint型の値を格納できます  
>2. intをbyte[4]に格納します　　
>     - 「>>」操作を使用して、バイトに格納する8ビットを最下位ビットに移動します. 
>     - 「&」演算を使用して、下位8桁以外の数値を0に変更します. [(「&」サンプル)](#jump2)
>     - 結果をバイト型に強力に変換します  

### 3.コード 
> ``` java
>    public static byte[] intToByteArray(int i) {
>        byte[] result = new byte[4];
>        result[0] = (byte)((i >> 24) & 0xFF);
>        result[1] = (byte)((i >> 16) & 0xFF);
>        result[2] = (byte)((i >> 8) & 0xFF);
>        result[3] = (byte)(i & 0xFF);
>        return result;
>    }
> ```
 「& 0xFFの意味は何ですか？説明をご参照ください。」 [(説明)](#jump99)

### 4.説明  
 <span id="jump1"></span> 
>1. $\color{#4285f4}{メモリ内のint型の例}$ 
>例：10進数の999  
>対応するバイナリ値は：1111100111  
>メモリ内のストレージ(2の補数は元の数と同じです)：  
> 00000000 00000000 00000011 11100111  
>例として10進数の- 999  
>元のコード：10000000 00000000 00000011 11100111  
>2の補数：11111111 11111111 11111100 00011001  
>メモリ内のストレージ：  
> 11111111 11111111 11111100 00011001  
>
>
>2. intをbyte [4]に格納する例  <span id="jump2"> </span> 
> 「&」操作を使用して上位ビットを「0」に変更します  
> 00000000 00000000 00000011 11100111 & 0xFF =>  
> 00000000 00000000 00000000 11100111  
>  <span id="jump99"></span> 
>「& 0xFFの」$\color{#34a853}{説明：}$  
> 0xFFは16進数で、2進数に変換されます：11111111
>上記の計算は次と同等です.  
> 　00000000 00000000 00000000 11111111(0xFF)   
> <u> & 00000000 00000000 00000011 11100111 </u>(999)  
> 　00000000 00000000 00000000 11100111  
>「&」が同時に1の場合、結果は1になります.それ以外の場合、結果は0になります.下位8ビットの結果を変更せずに保持すると、残りのビットは0になります.  
>「0000000000000000 00000000 11100111」をバイトに強制変換します.これは、下位8ビットをバイトに格納することと同じです.  

>
> 3. 結果の確認<span id="jump3"> </span>  
> ```byte [] bResult = intToByteArray(999);```  
> bResult [0] => 0($\color{#4285f4}{00000000}$ )   
> bResult [1] => 0($\color{#4285f4}{00000000}$ )  
> bResult [2] => 3($\color{#ea4335}{00000011}$ )  
> bResult [3] => - 25($\color{#fbbc05}{11100111}$ )  
>2の補数：$\color{#fbbc05}{11100111}$，対応する元の数：$\color{#34a853}{10011001}$  
> $\color{#34a853}{10011001}$対応する10進数は：- 25、最上位の桁1は負の数を表します.  
> ```byte [] bResult = intToByteArray(- 999);```  
> bResult [0] => - 1($\color{#4285f4}{11111111}$)  
> bResult [1] => - 1($\color{#4285f4}{11111111}$)  
> bResult [2] => - 4($\color{#ea4335}{11111100}$)  
> bResult [3] =>  25($\color{#fbbc05}{00011001}$)  
>2の補数：$\color{#4285f4}{11111111}$対応する元の数は：$\color{#34a853}{10000001}$  
> $\color{#34a853}{10000001}$対応する10進数：1、最上位の桁1は負の数を表します.  
>2の補数：$\color{#ea4335}{11111100}$対応する元の数は：$\color{#34a853}{10000100}$  
> 10000100対応する10進数は：4、最上位の桁1は負の数を表します.  
>2の補数：$\color{#fbbc05}{00011001}$対応する元の数は：$\color{#34a853}{00011001}$   
> 00011001対応する10進数は：25、最上位の桁0は正の数を表します.