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