十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
位邏輯運(yùn)算符有“與”(AND)、“或”(OR)、“異或(XOR)”、“非(NOT)”,分別用“”、“|”、“^”、“~”表示。

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供察雅企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、做網(wǎng)站、H5網(wǎng)站設(shè)計、小程序制作等業(yè)務(wù)。10年已為察雅眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
下面的例子說明了位邏輯運(yùn)算符:
// Demonstrate the bitwise logical operators.
class BitLogic {
public static void main(String args[]) {
String binary[] = {
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"
};
int a = 3; // 0 + 2 + 1 or 0011 in binary
int b = 6; // 4 + 2 + 0 or 0110 in binary
int c = a | b;
int d = a b;
int e = a ^ b;
int f = (~a b) | (a ~b);
int g = ~a 0x0f;
System.out.println(" a = " + binary[a]);
System.out.println(" b = " + binary[b]);
System.out.println(" a|b = " + binary[c]);
System.out.println(" ab = " + binary[d]);
System.out.println(" a^b = " + binary[e]);
System.out.println("~ab|a~b = " + binary[f]);
System.out.println(" ~a = " + binary[g]);
}
}
在本例中,變量a與b對應(yīng)位的組合代表了二進(jìn)制數(shù)所有的 4 種組合模式:0-0,0-1,1-0,和1-1。“|”運(yùn)算符和“”運(yùn)算符分別對變量a與b各個對應(yīng)位的運(yùn)算得到了變量c和變量d的值。對變量e和f的賦值說明了“^”運(yùn)算符的功能。字符串?dāng)?shù)組binary代表了0到15對應(yīng)的二進(jìn)制的值。在本例中,數(shù)組各元素的排列順序顯示了變量對應(yīng)值的二進(jìn)制代碼。數(shù)組之所以這樣構(gòu)造是因為變量的值n對應(yīng)的二進(jìn)制代碼可以被正確的存儲在數(shù)組對應(yīng)元素binary[n]中。例如變量a的值為3,則它的二進(jìn)制代碼對應(yīng)地存儲在數(shù)組元素binary[3]中。~a的值與數(shù)字0x0f (對應(yīng)二進(jìn)制為0000 1111)進(jìn)行按位與運(yùn)算的目的是減小~a的值,保證變量g的結(jié)果小于16。因此該程序的運(yùn)行結(jié)果可以用數(shù)組binary對應(yīng)的元素來表示。
-4的二進(jìn)制表示為1111 1111 1111 1011
i3 右移3位,移出的不管,左端補(bǔ)1 變?yōu)?111 1111 1111 1111 這是-1的二進(jìn)制表示,所以結(jié)果為-1.
i5 同理。
具體原理:
先來說一下怎么得出負(fù)數(shù)的二進(jìn)制。原碼,反碼,補(bǔ)碼,這三個概念搞清。
1、原碼:一個正數(shù),按照絕對值大小轉(zhuǎn)換成的二進(jìn)制數(shù);一個負(fù)數(shù)按照絕對值大小轉(zhuǎn)換成的二進(jìn)制數(shù),然后最高位補(bǔ)1,稱為原碼。
比如 00000000 00000000 00000000 00000101 是 5的 原碼。
10000000 00000000 00000000 00000101 是 -5的 原碼。
備注:
比如byte類型,用2^8來表示無符號整數(shù)的話,是0 - 255了;如果有符號, 最高位表示符號,0為正,1為負(fù),那么,正常的理解就是 -127 至 +127 了.這就是原碼了,值得一提的是,原碼的弱點(diǎn),有2個0,即+0和-0(10000000和00000000);還有就是,進(jìn)行異號相加或同號相減時,比較笨蛋,先要判斷2個數(shù)的絕對值大小,然后進(jìn)行加減操作,最后運(yùn)算結(jié)果的符號還要與大的符號相同;于是,反碼產(chǎn)生了。
2、反碼:正數(shù)的反碼與原碼相同,負(fù)數(shù)的反碼為對該數(shù)的原碼除符號位外各位取反[每一位取反(除符號位)]。
取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)
比如:正數(shù)00000000 00000000 00000000 00000101 的反碼還是 00000000 00000000 00000000 00000101
負(fù)數(shù)10000000 00000000 00000000 00000101 的反碼則是 11111111 11111111 11111111 11111010。
反碼是相互的,所以也可稱:10000000 00000000 00000000 00000101 和 11111111 11111111 11111111 11111010互為反碼。
備注:還是有+0和-0,沒過多久,反碼就成為了過濾產(chǎn)物,也就是,后來補(bǔ)碼出現(xiàn)了。
3、補(bǔ)碼:正數(shù)的補(bǔ)碼與原碼相同,負(fù)數(shù)的補(bǔ)碼為對該數(shù)的原碼除符號位外各位取反,然后在最后一位加1.
比如:10000000 00000000 00000000 00000101 的補(bǔ)碼是:11111111 11111111 11111111 11111010。
那么,補(bǔ)碼為:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
備注:1、從補(bǔ)碼求原碼的方法跟原碼求補(bǔ)碼是一樣的 ,也可以通過完全逆運(yùn)算來做,先減一,再取反。
2、補(bǔ)碼卻規(guī)定0沒有正負(fù)之分
所以,-5 在計算機(jī)中表達(dá)為:11111111 11111111 11111111 11111011。轉(zhuǎn)換為十六進(jìn)制:0xFFFFFFFB。
搞懂二進(jìn)制表示后,再來說一下左移右移運(yùn)算符。
左移運(yùn)算是將一個二進(jìn)制位的操作數(shù)按指定移動的位數(shù)向左移位,移出位被丟棄,右邊的空位一律補(bǔ)0。右移運(yùn)算是將一個二進(jìn)制位的操作數(shù)按指定移動的位數(shù)向右移動,移出位被丟棄,左邊移出的空位或者一律補(bǔ)0,或者補(bǔ)符號位,這由不同的機(jī)器而定。在使用補(bǔ)碼作為機(jī)器數(shù)的機(jī)器中,正數(shù)的符號位為0,負(fù)數(shù)的符號位為1。(均由機(jī)器來定)
So,為什么得到-1知道了吧~~~
| ^ ~
與 : 1010 1100 = 1000
或| :1010 |1100=1110
異或^ :1010^1100=0110
左移:11002=0000
右移:正數(shù)00112=0000 負(fù)數(shù)情況高位補(bǔ)1
右移:正數(shù),負(fù)數(shù)高位都補(bǔ)0
true
=
1
false
=
再看下面這段文字
一、邏輯運(yùn)算符:
包括:1。邏輯與
2。||邏輯或
3。!邏輯非
邏輯運(yùn)算符用于對包含關(guān)系運(yùn)算符的表達(dá)式進(jìn)行合并或取非
對于使用邏輯運(yùn)算符的表達(dá)式,返回0表示“假”,返回1表示“真”。關(guān)于邏輯運(yùn)算符的解釋
請注意:任何使用兩個字符做符號的運(yùn)算符,兩字符之間不應(yīng)有空格,即將==寫成=
=是錯誤的。
假設(shè)一個程序在同時滿足條件a10和b==7時,必須執(zhí)行某些操作。應(yīng)使用關(guān)系運(yùn)算符和邏輯運(yùn)算符“與”來寫這個
條件的代碼。用表示“與”運(yùn)算符,該條件代碼如下:
(a10)
(b==7);
類似地,“或”是用于檢查兩個條件中是否有一個為真的運(yùn)算符。它由兩個連續(xù)的管道符號(||)表示。如果上例
改為:如果任一語句為真,則程序需執(zhí)行某些操作,則條件代碼如下:
(a10)
||
(b==7);
第三個邏輯運(yùn)算符“非”用一個感嘆號(!)表示。這個運(yùn)算符對表達(dá)式的真值取反。例如,如果變量s小于10,程序
程序需執(zhí)行某些操作,則條件代碼如下:
(s10)
或
(!(s=10))
//s不大于等于10
關(guān)系運(yùn)算符和邏輯運(yùn)算符的優(yōu)先級一般都低于算術(shù)運(yùn)算符。例如,54+3的計算與5(4+3)運(yùn)算符是一樣的,即
先計算4+3,再執(zhí)行關(guān)系運(yùn)算。此表達(dá)示的結(jié)果為“假”,即,將返回0。
下面的語句
printf("%d",54+3);
將輸出
可以總結(jié)為:的結(jié)果是真真為真。||的結(jié)果是假假為假。
二、位運(yùn)算符:
包括:1。位與符
2。|位或符
3。^位異或符
4。~位取反符
以操作數(shù)12為例。位運(yùn)算符將數(shù)字12視為1100。位運(yùn)算符將操作數(shù)視為位而不是數(shù)值。數(shù)值
可以是任意進(jìn)制的:十進(jìn)制、八進(jìn)制或十六進(jìn)制。位運(yùn)算符則將操作數(shù)轉(zhuǎn)化為二進(jìn)制,并相應(yīng)地返回1或0。
位運(yùn)算符將數(shù)字視為二進(jìn)制值,并按位進(jìn)行相應(yīng)運(yùn)算,運(yùn)算完成后再重新轉(zhuǎn)換為數(shù)字。例如:
表達(dá)式1015表示(1010
1111),它將返回表示1010的值10。因為真真得真,或者是11得1,同位全是1結(jié)果也是1
表達(dá)式10|15表示(1010
|
1111),它將返回表示1111的值15。假假得假。全零得零。
表達(dá)式10^15表示(1010
^
1111),
它將返回表示0101的值5。此時是同性相斥,相同的就為假。
表達(dá)式~10表示(~1010),它將返回表示0101的值
-11。此號好理解,按位取反
正數(shù)取~:-(a+1)
負(fù)數(shù)取~:(a+1)
8是正數(shù),補(bǔ)碼與其源碼相同。為:0(符號位)...0001000(因為默認(rèn)是int型所以32位)
對其~操作后為:1(符號位)...1110111
顯霸氣編程源碼:取反加1(除去符號位)
1) 1(符號位)...1001000 除去符號取反
2) 1(符號位)...1001001 除去符號加1
所以最后是-9