如果連二進制的知識還沒搞懂, 那么計算機最基礎的你都還沒明白, 所以2進制對我們程序員來說, 是必會, 必學的知識
二進制在運算中的說明:
一.? 二進制是逢2進位的進位制, 0,1是基本算符
二.? 現代的電子計算機技術全部采用的是二進制, 因為它只使用0, 1兩個數字符號,非常簡單方便, 易于用電子方式實現。計算機內部處理的信息, 都是采用二進制數來表示的, 二進制 (Binary) 數用0和1兩個數字及其組合來表示任何數。進位規則是"逢2進1", 數字1在不同的位上代表不同的值, 按從右至左的次序, 這個值以二倍遞增.
-
1. 請看下面代碼, 回答a, b, c, d, e結果是多少?
int a = 1>>2; //向右位移2位int b = -1>>2;int c = 1<<2;int d = -1<<2;int e = 3>>>2;//算術右移
// a,b,c,d,e結果是多少?System.out.println("a ="+a);System.out.println("b ="+b);System.out.println("c ="+c);System.out.println("d ="+d);System.out.println("e ="+e);
-
請回答在java中, 下面的表達式運算結果是: (位操作), 練習題
~2=? //按位取反
2&3=? // 2按位與3
2|3=? //
~-5=?
13&7=?
5|4=?
-3^3=? //按位異或
原碼-反碼-補碼(重點 難點)
這些是計算機底層運行的最重要的機制, 很多程序員他們舍本逐末, 天天都在學框架, 然后學所謂的底層, 連最基本的都沒搞懂, 你說他能行嘛
網上對原碼, 反碼, 補碼的解釋過于復雜, 我這里精簡幾句話:(背下來), 這里背下來不是我規定的也不是老師規定的, 是計算機的設計者馮諾伊曼早就規定好的, 我們必須背下來
對于有符號的而言:
-
1.
二進制的最高位是符號位: 0 表示正數, 1 表示負數 (口訣: 0->0 1-> -)
符號位就是代表正或負 0正數, 1負數
-
2.
正數的原碼, 反碼, 補碼都一樣 (三碼合一)
-
3.
負數的反碼 = 它的原碼符號位不變, 其它位取反 (0->1,1->0)
什么是其它取反就是 0變1, 1變0
-
4.
負數的補碼 = 它的反碼 +1, 負數的反碼 = 負數的補碼 - 1
-
5.
0 的反碼, 補碼都是 0
-
6.
java沒有無符號數, 換言之, java中的數都是有符號的
-
7.
在計算機位運算的時候, 都是以補碼的方式來運算的.
他為什么要以補碼的方式來運算呢? : 因為補碼它可以解決正數和負數, 它把正數和負數用補碼統一起來了, 所以設計者設計這種原碼反碼補碼的規則特別的科學
-
8.
當我們看運算結果的時候, 要看它的原碼 (重點)
以上這些是一定一定要背下來的!!! 你如果背不住怎么辦呢? 那你就多背幾遍, 這個是一定要背下來的, 這個背不下來,我告訴大家你當程序員說實話很失敗的.
按位運算符
-
java中有7個位運算符(&, |, ^, ~, >>, <<和>>>)
分別是 按位與&, 按位或, 按位異或^, 按位取反~, 它們的運算規則是:
按位與 & :?
? ? ? ? ? ? ? ? 兩位全為1, 結果為1, 否則為0
舉例:
? ? ? ? ? ? ? ? 比如我兩個二進制 10010001 , 11110010 = 10010000
按位或 | :
? ? ? ? ? ? ? ? 兩位有一個為1, 結果為1, 否則為0
按位異或 ^ :
? ? ? ? ? ? ? ? 兩位一個為0, 一個為1, 結果為1, 否則為0
按位取反 ~ :
? ? ? ? ? ? ? ? 0 -> 1 , 1 -> 0
比如: 2&3=? -2=? ~~2=? 2|3=? 2^3=?
// 位運算
// 1.先得到 2的補碼 => 2的原碼 首先2是int(4個字節) 一個字節為8位數 00000000 00000000 00000000 00000010
// 2的補碼 00000000 00000000 00000000 00000010
// 2.3的補碼 3的原碼 00000000 00000000 00000000 00000011
// 3的補碼 00000000 00000000 00000000 00000011
// 3.按位&
// 00000000 00000000 00000000 00000010
// 00000000 00000000 00000000 00000011
// 00000000 00000000 00000000 00000010 & 運算后的補碼
// 運算后的原碼 也是 00000000 00000000 00000000 00000010
// 結果就是 2System.out.println(2&3); //2// 推導
// 1. 先得到 -2 的原碼 10000000 00000000 00000000 00000010
// 2. -2的反碼 1111111 11111111 11111111 11111101
// 3. -2的補碼 1111111 11111111 11111111 11111110
// 4. ~-2操作 00000000 00000000 00000000 00000001 運算后的補碼
// 5. 運算后的原碼 就是 00000000 00000000 00000000 00000001 => 1System.out.println(~-2); //1// 推導
// 1. 得到2的補碼 00000000 00000000 00000000 00000010
// 2. ~2操作 按位取反 11111111 11111111 11111111 11111101 運算后的補碼
// 3. 運算后的反碼 11111111 11111111 11111111 11111100
// 3. 運算后的原碼 10000000 00000000 00000000 00000011 => -3System.out.println(~2); //-3
移位操作符
-
還有三個運算符 >> , << 和 >>>, 運算規則:
1.
算數右移 >>:? 低位溢出, 符號位不變, 并用符號位補溢出的高位
2.
算數左移 <<: 符號位不變,低位補0
3.
>>>: 邏輯右移也叫無符號右移, 運算規則是: 低位溢出, 高位補0
4.
特別說明: 沒有 <<< 符號
-
應用案例 BitOperator
int a = 1 >> 2; //1 => 000000001 本質 1 / 2 / 2 =0int c = 1 << 2; //1 => 00000001 => 00000100 本質 1 * 2 * 2 = 4int d = 4 << 3; //4 => 本質 4 * 2 * 2 * 2 = 24int e = 15 >> 2; // 本質 15 / 2 / 2 = 3System.out.println(a); //0System.out.println(c); //4System.out.println(d); //24System.out.println(e); //3