編程基礎 二進制 解密

二進制基礎

進制轉換

十進制數字57轉換爲二進制方法:

用二進制表示57則爲(按權展開):111001=2^(6-1)+2^(5-1)+2^(4-1)+2^(1-1)=32+16+8+1=57
![十進制換算二進制][2]
換算爲二進制採用短除2
除法 商 餘數
2|5 2 1
2|1 0 1
直到商爲0,再將餘數倒序排列
![常用進制的換算][3]
![適合計算機的進制8、16都是2的整數次方,所以常用。][4]
![二進制 8進制:適用於12和36位的計算機系統][5]
![二進制][6]
![常用進制的換算][7]
![二進制轉十進制][8]

位運算

按位與 &: 同爲1,爲1 作用:清零、指定位求反
按位或 |: 同爲0,才爲0 作用:清零、指定位求反
按位異或 ^:相同,則爲0 作用:清零 、做中間變量
正數:原碼=補碼=反瑪;
負數:反碼=^原碼,補碼=反碼+1;
@二進制基礎——位運算
一、異或作用
1、對某個數定位翻轉:0^0=0 1^0=1 0^1=1 1^1=0
· 翻轉位異或1
· 不翻轉位異或0
2、兩個變量值交換:A=A^B;B=A^B;A=A^B(條件:A!=B)
二、左右移
1、左移<< :左丟棄,右補0,但注意整形爲32位
2、右移>> :右丟棄,左補0(整數)或者1(負數)
3、無符號右移>>> : 右丟棄,左補0
![負數以其正值的補碼形式表示(1/2)原碼反碼補碼][9]
![左移(<<)運算][10]
![右移(>>)運算][11]
![無符號右移(>>>)運算][12]
![二進制位運算][13]
(一)按位與&
特殊運輸
(1)清零,如果想將一個單元清零,即使其全部二進制位爲0,只要與一個各位都是零的數值相與,結果爲零。
(2)取一個數中指定位:找一個數,對應x要取的位,該數的對應位爲1,其餘位爲零,此數與x進行“與運算”可以得到x中的指定爲
(二)按位或|
特殊用法
常用來對一個數據的某些位置1:找到一個數,對應x要置1的位,該數的對應位爲1,其餘位爲零。此數與x相或可使x中的某些位置1。
(三)異或^
特殊用法
(1)使特定位翻轉:特定位異或1
(2)與0相異或,保留原值
(3)兩個變量交換值
1.藉助第三個變量來實現
2.利用加減法實現兩個變量的交換
A=A+B;B=A-B;B=A=B
3.異或運算
一個數異或本身等於0和異或運算符合交換律
A=A^B;B=A^B;A=A^B
(四)取反與運算~
對一個二進制數按位取反,即將0變爲1,1變0
(五)左移<<
將一個運算對象的各二進制位全部左移若干位,
(六)右移>>
將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。操作數每右移一位,相當於該數除以2
(七)無符號右移運算>>>
各個位向右移指定的位數。右移後左邊空出的位用零來填充。移除右邊的位被丟棄。

負數以其正數的補碼形式表示
反碼加1稱爲補碼
32位整數,最高位爲1,就是負數
負數 左移或者右移
![負數以其正值的補碼形式表示(2/2)][14]
按位與&:兩位全爲1,結果位才爲1
(清零、取一個數中的指定位)
|:兩位只要有一個位爲1,結果位就爲1
(將一個數的某些位置1)
^:兩位相異則該位結果爲1,否則爲0
![異或(^)運算 (續上)][15]
1.二進制位運算:

(1)且運算,1 & 1 = 1, 0 & 1 = 0;

(2)或運算,1 & 0 = 1

(3)異或運算,1 ^ 1 = 0,1 ^ 0 = 1; 兩個位的值不同,則結果爲1,相同結果爲0.
(4)<<左移運算符,還有看看是否有符號位。
(5)>>右移運算符,還要看看是否有符號位。
(6)~按位取反, ~1 = 0, ~0 = 1
(7)>>>無符號右移運算符,二進制各個位向右移指定的位數,右移後左邊空出來的位用零來填充,移出右邊的位被丟棄。
(8)<<<無符號左移運算符,二進制各個位向左移指定的位數,左移後右邊空出來的位用零來填充,移出左邊的位被丟棄。
【位運算的作用:(1)清零 (2)取一個數中指定位】
2.原碼,反碼(對原碼的每一個二進制位取反),補碼 = 反碼 + 1。

JDK內置的進制轉換

![Java中內置的進制轉換方法][16]
@二進制——JDK內置的進制轉換
static int parseInt(String s) 將字符串參數作爲有符號的十進制整數進行分析。
static Integer valueOf(int i) 返回一個表示指定的 int 值的 Integer 實例。
parseInt(“1011001”,2) 含義爲將二進制轉爲十進制。同樣可以用parseInt(“45”,8)來講八進制數45 轉爲十進制。調用方法爲: Integer.parseInt(…)
![此處輸入圖片的描述][17]
java內置的進制轉換

Integer.parseInt(“0100101”,2);//二進制轉換爲十進制
Integer.parseInt(“23”,8);//八進制轉換爲十進制
Integer.parseInt(“A2”,16);//十六進制轉換爲十進制

java中的進制

位運算
Integer.toBinaryString(112) //二進制
Integer.toHexString(112) //十六進制
Integer.toOctalString(112) //八進制
Integer.parseInt("111001",2)//二進制數111001轉換成十進制數

http://blog.csdn.net/iukey/article/details/7195265
http://blog.csdn.net/zhaoshuzhaoshu/article/details/37600857

public static byte[] int2Bytes(int id) {
byte[] arr = new byte[4];
for (int i = 0; i < arr.length; i++) {
arr[i] = (byte) ((int) (id >> i * 8) & 0xff);
}
return arr;
}

public static int byte2Int(byte[] arr) {
int result = 0;
for (int i = 0; i < arr.length; i++) {
result += (int) ((arr[i] & 0xff) << i * 8);
}
return result;

位運算的幾個應用:
1) 判斷int型變量a是奇數還是偶數
a&1 = 0 偶數
a&1 = 1 奇數
2) 取int型變量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1 (先右移再與1)
3) 將int型變量a的第k位清0,即a=a&~( 1 < < k) (10000 取反後爲00001 )
4) 將int型變量a的第k位置1,即a=a|(1<< k)
5) int型變量循環左移k次,即a=a<< k|a>>16-k (設sizeof(int)=16)
6) int型變量a循環右移k次,即a=a>>k|a<<16-k (設sizeof(int)=16)
7)對於一個數 x >= 0,判斷是不是2的冪。
boolean power2(int x){return ( (x&(x-1))==0) && (x!=0);}
(8)不用temp交換兩個整數
void swap(int x , int y)
{x ^= y;y ^= x;x ^= y;}
(9)計算絕對值
int abs( int x ){int y ;y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
10)取模運算轉化成位運算 (在不產生溢出的情況下)
a % (2^n) 等價於 a & (2^n - 1)
11)乘法運算轉化成位運算 (在不產生溢出的情況下)
a * (2^n) 等價於 a<< n
12)除法運算轉化成位運算 (在不產生溢出的情況下)
a / (2^n) 等價於 a>> n
例: 12/8 == 12>>3
13) a % 2 等價於 a & 1
14) if (x == a)
x= b;
else x= a;
等價於 x= a ^ b ^ x;
15) x 的 相反數 表示爲 (~x+1)
16)輸入2的n次方:1 << 19
17)乘除2的倍數:千萬不要用乘除法,非常拖效率。只要知道左移1位就是乘以2,右移1位就是除以2就行了。比如要算25 * 4,用25 << 2就好啦

![基本數據類型][18]
Java中的數據類型:
一、四種基本類型:
1、int類型:
1.1、byte(Byte):8bit;
1.2、short(Short):16bit;
1.3、int(Integer):32bit;
1.4、long(Long):64bit;
2、float類型:
2.1、單精度:float(Float),32bit;
2.2、雙精度:double(Double),64bit;
3、boolean(Boolean)類型:取值true或false;
4、char(Character)類型:Unicode字符,16bit;

注:括號中爲該類型對應的類類型!
![大小端][19]
![大小端(2/2)][20]
![字符串與字節的轉化][21]
在服務器客戶端模型中, 客戶端使用java,發送serializable參數,服務器de-serializable。
C作爲更加底層的語言,服務器若使用c會更具效率,但無法做到de-serializable,因此改爲由客戶端發出0,1表示的二進制參數。因此也就用到了java中二進制,位操作的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章