複習筆記6 位運算 2進制數據的操作

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;
	}
}

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