位運算
口訣
位運算應用口位運算應用口訣位運算應用口訣清零取反要用與,某位置一可用或
若要取反和交換,輕輕松松用異或
運算規則
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,反之