位運算是針對二進制的每一位進行的運算,它是專門針對數字0和1進行的操作。程序中的所有數在計算機內存中都是以二進制補碼的形式儲存的。位運算是直接對整數在內存中的二進制補碼進行操作,位運算即可以節約內存,同時使程序速度更快效率更高。(以下皆基礎,暫不做深入瞭解)
Java位用算運算符又可以分爲 邏輯運算符 和 位移運算符 ;
邏輯運算符有:按位與 &、按位或 |、取反 ~、按位異或^;
位移運算符有:左移 <<、右移 >>、無符號右移 >>>;
同時所有的位運算符中,除~以外,其餘均爲二元運算符操作數,並且位運算的運算對象爲整型和字符型數據 。
邏輯運算符:在邏輯運算符&、|、~、^中,機器數的符號位也是參與運算的
& 與運算符:
與運算是將參與用算兩個二進制數進行&用算,如果兩個二進制位都是1,則與用算的結果爲1,其他全都爲0;
應用,取餘:類似15的二進制表示爲1111,8的二進制表示爲111,任意數a &上這類數b,其實就相當於對a取餘(b+1),即 a % (b+1)= a & b,判斷奇偶數就可以用 a &1 。這種取餘用法在棋牌遊戲開發中較爲多見。
| 或運算符:
或運算是將參與用算兩個二進制數進行 | 用算,如果兩個二進制位都是0,則與運算的結果爲0,其他全都爲1,即只要其中一個數字的二進制位是1,這個二進制位的運算結果就爲1;
~ 取反運算符:
取反運算是隻針對一個數據進行操作,如果二進制是0,則取反爲1,如果二進制是1,則取反爲0;
^ 異或運算符:
異或^運算是將參與運算的兩個二進制進行“異或”運算,如果二進制位相同,則結果爲1,否則爲0;
應用,不進位加法:a ^ b就是a和b相加之後,該進位的地方不進位的結果(但是5^8還是等於13);
位移運算符:
位移運算符基本規律:short,byte,char,int
在位運算時先轉換
爲int
所以內存長度length=32
;long
在位運算時內存長度length=64
;
左移運算是將操作數二進制值逐位左移若干位,左移過程中符號位不變 ,高位溢出並捨棄,低位補0;
右移運算是將操作數二進制值逐位右移若干位,右移過程中符號位不變 ,低位溢出並捨棄,並用符號位補溢出的高位[即負數補1,正數補0];
位運算m左移n結果等於,對應着右移m>>n結果等於
>>> 無符號右移是將操作數所有二進制值逐位右移若干位,包括最高位符號位,也跟着右移,低位溢出並捨棄,高位補0;
注意,無符號右移(>>>)中的符號位(最高位)也跟着變;
在計算機系統中通常是以補碼的形式存在的,以16位int數據爲例,其中最爲特殊的就 -1的補碼 , -1的補碼爲:1111 1111 1111 1111;通過-1>>>n可以獲取(二進制)從低位到指定位n全部爲1的值;同時使用-1<< m可以獲取從指定位m到符號位全部爲1的值;通過(-1>>>n)&(-1<< m)就可以獲取二進制中指定位置(低位到高位)全部爲1的int值;