public class Test7
{
public static void main(String[] args)
{
// & 按位與
//看這行像什麼,像邏輯運算符哪裏我們寫的吧
//0爲假,1爲真,那麼結論就是第四行爲1
//而在運算方面,我們可以根據這個規則進行
//逐位運算,即同爲1爲1,否則爲0
System.out.println(0 & 0);
System.out.println(0 & 1);
System.out.println(1 & 0);
System.out.println(1 & 1);
System.out.println("======================================>");
//可以明確的看到只有最後1位都爲1吧,結果就是1
System.out.println(getIntegerToBinary(3).substring(24));
System.out.println(getIntegerToBinary(5).substring(24));
System.out.println(getIntegerToBinary(3 & 5).substring(24));
System.out.println("======================================>");
//在觀察這個我們發現一點有趣的現象?
System.out.println(getIntegerToBinary(7).substring(24));
System.out.println(getIntegerToBinary(5).substring(24));
System.out.println(getIntegerToBinary(7 & 5).substring(24));
System.out.println("======================================>");
//一排1也就是-1 & 任何數,結果還是他自己
//可以發現所有任意數爲1的位都和-1中的該位
//重合
//可以把這個理解成數學中的求交集
System.out.println(getIntegerToBinary(-1));
System.out.println(getIntegerToBinary(1644687));
System.out.println(getIntegerToBinary(-1 & 1644687));
System.out.println("======================================>");
//任何數和0 進行&操作都會得到0,這個操作經常用來清0
//而在數學中,任何集合都不可能和一個空集產生交集
System.out.println(getIntegerToBinary(0));
System.out.println(getIntegerToBinary(1644687));
System.out.println(getIntegerToBinary(0 & 0));
System.out.println("======================================>");
//這裏可以看到,0x1f是前邊我們講的拿一個數最後5位,
//而這個0xaaaaaaaa,最後五位01010,前邊數據被拋棄
//這裏可以很簡單的綜合上邊的結論,0x1f的5位前都是0吧?
//任何數跟0 & 都是0,而後邊是不是跟咱們的-1那個很像?
//而這個數跟1排1 & 還是自己吧?
//這個操作我們叫做取指定位
System.out.println(getIntegerToBinary(0x1f));
System.out.println(getIntegerToBinary(0xaaaaaaaa));
System.out.println(getIntegerToBinary(0x1f & 0xaaaaaaaa));
System.out.println("======================================>");
//0xaaaaaaaa 中間的0不太好看拿了多少位,所以用-1
System.out.println(getIntegerToBinary(0xffffffff));
//取後四位
System.out.println(getIntegerToBinary(0xf & 0xffffffff));
//取前四位
System.out.println(getIntegerToBinary(0xf0000000 & 0xffffffff));
//同時取前四位和後四位,至於怎麼玩,那是你自己的事情。
//在這裏我們用的是16進制,那麼16進製表示的是4位2進制位
//表示16進制的1位,所以我們只需要寫8位。
//如果覺得16進制的4位有點大,可以考慮用8進制,但是不好用
//一般人都不認識,再說位不是整除的32/3你還少1位,蛋疼
System.out.println(getIntegerToBinary(0xf000000f & 0xffffffff));
System.out.println("======================================>");
// | 按位或
//有一個爲1,就爲1,看着就懂,不多說
//這個運算符可以當成數學中的求並集
System.out.println(0 | 0);
System.out.println(0 | 1);
System.out.println(1 | 0);
System.out.println(1 | 1);
System.out.println("======================================>");
//可以看到,結果是111,這就是 | 的用法,低3位都有1出現,所以是111
System.out.println(getIntegerToBinary(3).substring(24));
System.out.println(getIntegerToBinary(5).substring(24));
System.out.println(getIntegerToBinary(3 | 5).substring(24));
System.out.println("======================================>");
//有趣的現象又來了,呵呵
System.out.println(getIntegerToBinary(7).substring(24));
System.out.println(getIntegerToBinary(5).substring(24));
System.out.println(getIntegerToBinary(7 | 5).substring(24));
System.out.println("======================================>");
//-1 | 上任何數,結果還是-1,只能說-1這個集合裏涵蓋了你的任何組合
System.out.println(getIntegerToBinary(-1));
System.out.println(getIntegerToBinary(1644687));
System.out.println(getIntegerToBinary(-1 | 1644687));
System.out.println("======================================>");
//0 | 上任何數,結果還是這個數,這個操作沒什麼太多實際意義
//但如果是開發中,發現|操作的值沒有改變,你首先應該想到|0了
System.out.println(getIntegerToBinary(0));
System.out.println(getIntegerToBinary(1644687));
System.out.println(getIntegerToBinary(0 | 1644687));
System.out.println("======================================>");
//這個你會發現是往上填數據
System.out.println(getIntegerToBinary(0));
System.out.println(getIntegerToBinary(0xf));
//低4位填1
System.out.println(getIntegerToBinary(0 | 0xf));
//高4位填1,這裏沒寫0xf0000000,就是說一下這個數怎麼來的
System.out.println(getIntegerToBinary(0 | (0xf << 28)));
//高低四位同時填1 0 | 0xf000000f是一樣的
System.out.println(getIntegerToBinary(0 | (0xf | (0xf << 28))));
System.out.println("======================================>");
// ^ 按位異或
//兩位不一樣爲1,一樣爲假
System.out.println(0 ^ 0);
System.out.println(0 ^ 1);
System.out.println(1 ^ 0);
System.out.println(1 ^ 1);
System.out.println("======================================>");
//有效位的頭兩位都是不一樣的吧,所以最後結果是110
System.out.println(getIntegerToBinary(3).substring(24));
System.out.println(getIntegerToBinary(5).substring(24));
System.out.println(getIntegerToBinary(3 ^ 5).substring(24));
System.out.println("======================================>");
//這個更有趣,有什麼發現?好好想想
System.out.println(getIntegerToBinary(7).substring(24));
System.out.println(getIntegerToBinary(5).substring(24));
System.out.println(getIntegerToBinary(7 ^ 5).substring(24));
System.out.println("======================================>");
//這是神馬?還沒發現麼?傳說中的取反
System.out.println(getIntegerToBinary(-1));
System.out.println(getIntegerToBinary(1644687));
System.out.println(getIntegerToBinary(-1 ^ 1644687));
//有什麼感想?呵呵
System.out.println((-1 ^ 1644687) + 1);
System.out.println("======================================>");
//0 ^ 上任何數,結果還是這個數,這讓我們想起來什麼了呢?
//跟按位或一樣的是吧。
System.out.println(getIntegerToBinary(0));
System.out.println(getIntegerToBinary(1644687));
System.out.println(getIntegerToBinary(0 ^ 1644687));
System.out.println("======================================>");
//按位異或的魅力不止於此,它可以實現局部取反
System.out.println(getIntegerToBinary(0x6ffffff6));
//低4位取反
System.out.println(getIntegerToBinary(0x6ffffff6 ^ 0xf));
//高4位取反
System.out.println(getIntegerToBinary(0x6ffffff6 ^ 0xf0000000));
//高低四位同時取反
System.out.println(getIntegerToBinary(0x6ffffff6 ^ 0xf000000f));
System.out.println("======================================>");
// ~ 取反運算符
// 0變1 1變0
//但跟 ^ 不一樣,~是全取反,不能實現局部取反
System.out.println(getIntegerToBinary(0));
System.out.println(getIntegerToBinary(~0));
System.out.println("======================================>");
System.out.println(getIntegerToBinary(1));
System.out.println(getIntegerToBinary(~1));
System.out.println("======================================>");
}
public static final String DEFAULT_INT_ZERO = "00000000000000000000000000000000";
public static final String getIntegerToBinary(int value)
{
String binary = Integer.toBinaryString(value);
int length = Integer.SIZE - binary.length();
return DEFAULT_INT_ZERO.substring(0, length) + binary;
}
}
複習筆記6 位運算 2進制數據的操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.