在筆試題中經(jīng)常遇見這個題目,所以著重學(xué)習(xí)以下阐枣。
原文鏈接=====https://www.cnblogs.com/lichengze/p/5713409.html
位運(yùn)算符主要針對二進(jìn)制,它包括了:“與”奄抽、“非”蔼两、“或”、“異或”逞度。從表面上看似乎有點(diǎn)像邏輯運(yùn)算符额划,但邏輯運(yùn)算符是針對兩個關(guān)系運(yùn)算符來進(jìn)行邏輯運(yùn)算,而位運(yùn)算符主要針對兩個二進(jìn)制數(shù)的位進(jìn)行邏輯運(yùn)算档泽。下面詳細(xì)介紹每個位運(yùn)算符俊戳。
1.與運(yùn)算符
與運(yùn)算符用符號“&”表示,其使用規(guī)律如下:
兩個操作數(shù)中位都為1馆匿,結(jié)果才為1抑胎,否則結(jié)果為0,例如下面的程序段渐北。
public class data13
{
????public static void main(String[] args)
????{
????????int a=129;
????????int b=128;
????????System.out.println("a 和b 與的結(jié)果是:"+(a&b));
????}
}
運(yùn)行結(jié)果
a 和b 與的結(jié)果是:128
下面分析這個程序:
“a”的值是129阿逃,轉(zhuǎn)換成二進(jìn)制就是10000001,而“b”的值是128赃蛛,轉(zhuǎn)換成二進(jìn)制就是10000000恃锉。根據(jù)與運(yùn)算符的運(yùn)算規(guī)律,只有兩個位都是1焊虏,結(jié)果才是1淡喜,可以知道結(jié)果就是10000000,即128诵闭。
2.或運(yùn)算符
或運(yùn)算符用符號“|”表示炼团,其運(yùn)算規(guī)律如下:
兩個位只要有一個為1,那么結(jié)果就是1疏尿,否則就為0瘟芝,下面看一個簡單的例子。
public class data14
{
????public static void main(String[] args)
????{
????????int a=129;
????????int b=128;
????????System.out.println("a 和b 或的結(jié)果是:"+(a|b));
????}
}
運(yùn)行結(jié)果
a 和b 或的結(jié)果是:129
下面分析這個程序段:
a 的值是129褥琐,轉(zhuǎn)換成二進(jìn)制就是10000001锌俱,而b 的值是128,轉(zhuǎn)換成二進(jìn)制就是10000000敌呈,根據(jù)或運(yùn)算符的運(yùn)算規(guī)律贸宏,只有兩個位有一個是1造寝,結(jié)果才是1,可以知道結(jié)果就是10000001吭练,即129诫龙。
3.非運(yùn)算符
非運(yùn)算符用符號“~”表示,其運(yùn)算規(guī)律如下:
如果位為0鲫咽,結(jié)果是1签赃,如果位為1,結(jié)果是0分尸。
最近做的筆試題中出現(xiàn)這樣一道題:
題目:What results from the following code fragment?
? ? int i = 5;
? ? int j = 10;
? ? System.out.println(i + ~j);
? ? A Compilation error because”~”doesn’t operate on integers
? ? B -5
? ? C -6
? ? D 15
答案是C锦聊。原來~是按位取反
10的原碼:????? 0000 0000 0000 1010
由于在計算機(jī)中以補(bǔ)碼形式存儲,又正數(shù)的補(bǔ)碼就是原碼本身箩绍,所以計算機(jī)可以直接計算~10
~10按位取反:1111 1111 1111 0101
那還是計算機(jī)中以補(bǔ)碼形式存儲孔庭,所以當(dāng)前的計算后的~10是補(bǔ)碼形式,我們要對其求原碼材蛛,又因?yàn)樨?fù)數(shù)的補(bǔ)碼是原碼按位取反再加1史飞,所以,我們可以得到反碼(補(bǔ)碼減1)
~10的反碼:? 1111 1111 1111 0100
~10的原碼:? 1000 0000 0000 1011
所以~10是-11在計算機(jī)的補(bǔ)碼仰税,所以最終答案是C。
4.異或運(yùn)算符
異或運(yùn)算符是用符號“^”表示的抽诉,其運(yùn)算規(guī)律是:
兩個操作數(shù)的位中陨簇,相同則結(jié)果為0,不同則結(jié)果為1迹淌。下面看一個簡單的例子河绽。
public class data16
{
????public static void main(String[] args)
????{
????????int a=15;
????????int b=2;
????????System.out.println("a 與 b 異或的結(jié)果是:"+(a^b));
????}
}
運(yùn)行結(jié)果
a 與 b 異或的結(jié)果是:13
分析上面的程序段:a 的值是15,轉(zhuǎn)換成二進(jìn)制為1111唉窃,而b 的值是2耙饰,轉(zhuǎn)換成二進(jìn)制為0010,根據(jù)異或的運(yùn)算規(guī)律纹份,可以得出其結(jié)果為1101 即13苟跪。