天天看點

位運算

位運算

口訣

位運算應用口位運算應用口訣位運算應用口訣
清零取反要用與,某位置一可用或
若要取反和交換,輕輕松松用異或

運算規則

1. 按位與&

如果兩個相應的二進位都為1,則該位的結果為1,否則為0;

2. 按位或|

兩個對應的二進制隻要有1,該位結果值為1

3. 異或運算^

相同為0,不同為1

4. 異或的兩個原理:

兩個相同的數異或運算的結果為:0
某數與0異或運算,結果為自身.

移位運算

要點 1:它們都是雙目運算符,兩個運算分量都是整形,結果也是整形。
2 " >>"右移:右邊的位被擠掉。對于左邊移出的空位,如果是正數則空位補0,若為負數,可能補0或補1,這取決于所用的計算機系統。
num<<2 相當于 num*4,num>>2 相當于num/4

4 ">>>"運算符,右邊的位被擠掉,對于左邊移出的空位一概補上0。

位運算符的應用

無符号位移當需要移位的是正數時,與有符号位移一緻

按位與&

清零特定位 (mask中特定位置0,其它位為1,s=s&mask)
例子:
//例如把a 的高八位清 0 , 保留低八位
a&255//255為(0000000011111111)

//Java中HashTable中的應用,0x7FFFFFFF為int最大值,首位為0其他都是1,用以保證hash & 0x7FFFFFFF必定為整數
int index = (hash & 0x7FFFFFFF) % tab.length;

           
取某數中指定位 (mask中特定位置1,其它位為0,s=s&mask)
例子:
//位掩碼應用,利用位掩碼可以用來管理權限
public class NewPermission {
	// 是否允許查詢,二進制第1位,0表示否,1表示是
	public static final int ALLOW_SELECT = 1 << 0; // 0001
	
	// 是否允許新增,二進制第2位,0表示否,1表示是
	public static final int ALLOW_INSERT = 1 << 1; // 0010
	
	// 是否允許修改,二進制第3位,0表示否,1表示是
	public static final int ALLOW_UPDATE = 1 << 2; // 0100
	
	// 是否允許删除,二進制第4位,0表示否,1表示是
	public static final int ALLOW_DELETE = 1 << 3; // 1000
	
	// 存儲目前的權限狀态
	private int flag;

	/**
	 *  重新設定權限
	 */
	public void setPermission(int permission) {
		flag = permission;
	}

	/**
	 *  添加一項或多項權限
	 *  flag = 0001 | 0100,也就是0101,便擁有了Select和Update兩項權限
	 */
	public void enable(int permission) {
		flag |= permission;
	}
	
	/**
	 *  删除一項或多項權限
	 *  0101&(~0001),0101&1110=0100
	 */
	public void disable(int permission) {
		flag &= ~permission;
	}
	
	/**
	 *  是否擁某些權限
	 *  0101&0001=0001,0001==ALLOW_SELECT,可知擁有查詢權限
	 */
	public boolean isAllow(int permission) {
		return (flag & permission) == permission;
	}
	
	/**
	 *  是否禁用了某些權限
	 *  0101&0010=0000,可知擁有沒有該權限
	 */
	public boolean isNotAllow(int permission) {
		return (flag & permission) == 0;
	}
	
	/**
	 *  是否僅僅擁有某些權限
	 */
	public boolean isOnlyAllow(int permission) {
		return flag == permission;
	}
}
           

按位或¦

常用來将源操作數某些位置變成1,其它位不變。 (mask中特定位置1,其它位為0 s=s ¦mask)

位異或^

使特定位的值取反(mask中特定位置1,其它位為0 s=s^mask)
不引入第三變量,交換兩個變量的值
x ^= y; 
y ^= x; 
x ^= y; 
           

位非( ~ )

5轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0101
-6轉換為二進制:1111 1111 1111 1111 1111 1111 1111 1010
位非:操作數的第n位為1,那麼結果的第n位為0,反之