位運算及其應用

原文鏈接:https://blog.csdn.net/black_bird_cn/article/details/80171652

位運算是針對二進制的每一位進行的運算,它是專門針對數字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=32long 在位運算時內存長度length=64

左移運算是將操作數二進制值逐位左移若干位,左移過程中符號位不變 ,高位溢出並捨棄,低位補0;

右移運算是將操作數二進制值逐位右移若干位,右移過程中符號位不變 ,低位溢出並捨棄,並用符號位補溢出的高位[即負數補1,正數補0];

位運算m左移n結果等於m*2^n,對應着右移m>>n結果等於m/2^{n}

>>> 無符號右移是將操作數所有二進制值逐位右移若干位,包括最高位符號位,也跟着右移,低位溢出並捨棄高位補0
注意,無符號右移(>>>)中的符號位(最高位)也跟着變;

在計算機系統中通常是以補碼的形式存在的,以16位int數據爲例,其中最爲特殊的就 -1的補碼 , -1的補碼爲:1111 1111 1111 1111;通過-1>>>n可以獲取(二進制)從低位到指定位n全部爲1的值;同時使用-1<< m可以獲取從指定位m到符號位全部爲1的值;通過(-1>>>n)&(-1<< m)就可以獲取二進制中指定位置(低位到高位)全部爲1的int值;


 

 

 

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