java位運算符,java位運算符作用

本文目錄一覽:

Java中位運算符的具體應用是什麼,在實際編程中有什麼作用

位邏輯運算符有“與”(AND)、“或”(OR)、“異或(XOR)”、“非(NOT)”,分別用“”、“|”、“^”、“~”表示。

下面的例子說明了位邏輯運算符:

//

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;

//

+

2

+

1

or

0011

in

binary

int

b

=

6;

//

4

+

2

+

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對應位的組合代表了二進制數所有的

4

種組合模式:0-0,0-1,1-0,和1-1。“|”運算符和“”運算符分別對變量a與b各個對應位的運算得到了變量c和變量d的值。對變量e和f的賦值說明了“^”運算符的功能。字符串數組binary代表了0到15對應的二進制的值。在本例中,數組各元素的排列順序顯示了變量對應值的二進制代碼。數組之所以這樣構造是因為變量的值n對應的二進制代碼可以被正確的存儲在數組對應元素binary[n]中。例如變量a的值為3,則它的二進制代碼對應地存儲在數組元素binary[3]中。~a的值與數字0x0f

(對應二進制為0000

1111)進行按位與運算的目的是減小~a的值,保證變量g的結果小於16。因此該程序的運行結果可以用數組binary對應的元素來表示。

java中的位運算符及其用法。

位邏輯運算符有“與”(AND)、“或”(OR)、“異或(XOR)”、“非(NOT)”,分別用“”、“|”、“^”、“~”表示。

下面的例子說明了位邏輯運算符:

// 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對應位的組合代表了二進制數所有的 4 種組合模式:0-0,0-1,1-0,和1-1。“|”運算符和“”運算符分別對變量a與b各個對應位的運算得到了變量c和變量d的值。對變量e和f的賦值說明了“^”運算符的功能。字符串數組binary代表了0到15對應的二進制的值。在本例中,數組各元素的排列順序顯示了變量對應值的二進制代碼。數組之所以這樣構造是因為變量的值n對應的二進制代碼可以被正確的存儲在數組對應元素binary[n]中。例如變量a的值為3,則它的二進制代碼對應地存儲在數組元素binary[3]中。~a的值與數字0x0f (對應二進制為0000 1111)進行按位與運算的目的是減小~a的值,保證變量g的結果小於16。因此該程序的運行結果可以用數組binary對應的元素來表示。該程序的輸出如下:

a = 0011

b = 0110

a|b = 0111

ab = 0010

a^b = 0101

~ab|a~b = 0101

~a = 1100

左移運算符

左移運算符使指定值的所有位都左移規定的次數。它的通用格式如下所示:

value num

這裡,num指定要移位值value移動的位數。也就是,左移運算符使指定值的所有位都左移num位。每左移一個位,高階位都被移出(並且丟棄),並用0填充右邊。這意味着當左移的運算數是int類型時,每移動1位它的第31位就要被移出並且丟棄;當左移的運算數是long類型時,每移動1位它的第63位就要被移出並且丟棄。

在對byte和short類型的值進行移位運算時,你必須小心。因為你知道Java在對表達式求值時,將自動把這些類型擴大為 int型,而且,表達式的值也是int型 。對byte和short類型的值進行移位運算的結果是int型,而且如果左移不超過31位,原來對應各位的值也不會丟棄。但是,如果你對一個負的byte或者short類型的值進行移位運算,它被擴大為int型後,它的符號也被擴展。這樣,整數值結果的高位就會被1填充。因此,為了得到正確的結果,你就要捨棄得到結果的高位。這樣做的最簡單辦法是將結果轉換為byte型。下面的程序說明了這一點:

// Left shifting a byte value.

class ByteShift {

public static void main(String args[]) {

byte a = 64, b;

int i;

i = a 2;

b = (byte) (a 2);

System.out.println(“Original value of a: ” + a);

System.out.println(“i and b: ” + i + ” ” + b);

}

}

該程序產生的輸出下所示:

Original value of a: 64

i and b: 256 0

因變量a在賦值表達式中,故被擴大為int型,64(0100 0000)被左移兩次生成值256(10000 0000)被賦給變量i。然而,經過左移後,變量b中惟一的1被移出,低位全部成了0,因此b的值也變成了0。

既然每次左移都可以使原來的操作數翻倍,程序員們經常使用這個辦法來進行快速的2的乘法。但是你要小心,如果你將1移進高階位(31或63位),那麼該值將變為負值。下面的程序說明了這一點:

// Left shifting as a quick way to multiply by 2.

class MultByTwo {

public static void main(String args[]) {

int i;

int num = 0xFFFFFFE;

for(i=0; i4; i++) {

num = num 1;

System.out.println(num);

}

}

}

該程序的輸出如下所示:

536870908

1073741816

2147483632

-32

初值經過仔細選擇,以便在左移 4 位後,它會產生-32。正如你看到的,當1被移進31位時,數字被解釋為負值。

右移運算符

右移運算符使指定值的所有位都右移規定的次數。它的通用格式如下所示:

value num

這裡,num指定要移位值value移動的位數。也就是,右移運算符使指定值的所有位都右移num位。

下面的程序片段將值32右移2次,將結果8賦給變量a:

int a = 32;

a = a 2; // a now contains 8

當值中的某些位被“移出”時,這些位的值將丟棄。例如,下面的程序片段將35右移2次,它的2個低位被移出丟棄,也將結果8賦給變量a:

int a = 35;

a = a 2; // a still contains 8

用二進制表示該過程可以更清楚地看到程序的運行過程:

00100011 35

2

00001000 8

將值每右移一次,就相當於將該值除以2並且捨棄了餘數。你可以利用這個特點將一個整數進行快速的2的除法。當然,你一定要確保你不會將該數原有的任何一位移出。

右移時,被移走的最高位(最左邊的位)由原來最高位的數字補充。例如,如果要移走的值為負數,每一次右移都在左邊補1,如果要移走的值為正數,每一次右移都在左邊補0,這叫做符號位擴展(保留符號位)(sign extension),在進行右移操作時用來保持負數的符號。例如,–8 1 是–4,用二進制表示如下:

11111000 –8

1

11111100 –4

一個要注意的有趣問題是,由於符號位擴展(保留符號位)每次都會在高位補1,因此-1右移的結果總是–1。有時你不希望在右移時保留符號。例如,下面的例子將一個byte型的值轉換為用十六進制表示。注意右移後的值與0x0f進行按位與運算,這樣可以捨棄任何的符號位擴展,以便得到的值可以作為定義數組的下標,從而得到對應數組元素代表的十六進制字符。

// Masking sign extension.

class HexByte {

static public void main(String args[]) {

char hex[] = {

‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’,

‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f”

};

byte b = (byte) 0xf1;

System.out.println(“b = 0x” + hex[(b 4) 0x0f] + hex[b 0x0f]);

}

}

該程序的輸出如下:

b = 0xf1

無符號右移

正如上面剛剛看到的,每一次右移,運算符總是自動地用它的先前最高位的內容補它的最高位。這樣做保留了原值的符號。但有時這並不是我們想要的。例如,如果你進行移位操作的運算數不是數字值,你就不希望進行符號位擴展(保留符號位)。當你處理像素值或圖形時,這種情況是相當普遍的。在這種情況下,不管運算數的初值是什麼,你希望移位後總是在高位(最左邊)補0。這就是人們所說的無符號移動(unsigned shift)。這時你可以使用Java的無符號右移運算符,它總是在左邊補0。下面的程序段說明了無符號右移運算符。在本例中,變量a被賦值為-1,用二進制表示就是32位全是1。這個值然後被無符號右移24位,當然它忽略了符號位擴展,在它的左邊總是補0。這樣得到的值255被賦給變量a。

int a = -1;

a = a 24;

下面用二進制形式進一步說明該操作:

11111111 11111111 11111111 11111111 int型- 1的二進制代碼

24 無符號右移24位

00000000 00000000 00000000 11111111 int型255的二進制代碼由於無符號右移運算符只是對32位和64位的值有意義,所以它並不像你想象的那樣有用。因為你要記住,在表達式中過小的值總是被自動擴大為int型。這意味着符號位擴展和移動總是發生在32位而不是8位或16位。這樣,對第7位以0開始的byte型的值進行無符號移動是不可能的,因為在實際移動運算時,是對擴大後的32位值進行操作。下面的例子說明了這一點:

// Unsigned shifting a byte value.

class ByteUShift {

static public void main(String args[]) {

char hex[] = {

‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’,

‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’

};

byte b = (byte) 0xf1;

byte c = (byte) (b 4);

byte d = (byte) (b 4);

byte e = (byte) ((b 0xff) 4);

System.out.println(” b = 0x”

+ hex[(b 4) 0x0f] + hex[b 0x0f]);

System.out.println(” b 4 = 0x”

+ hex[(c 4) 0x0f] + hex[c 0x0f]);

System.out.println(” b 4 = 0x”

+ hex[(d 4) 0x0f] + hex[d 0x0f]);

System.out.println(“( b 0xff) 4 = 0x”

+ hex[(e 4) 0x0f] + hex[e 0x0f]);

}

}

該程序的輸出顯示了無符號右移運算符對byte型值處理時,實際上不是對byte型值直接操作,而是將其擴大到int型後再處理。在本例中變量b被賦為任意的負byte型值。對變量b右移4位後轉換為byte型,將得到的值賦給變量c,因為有符號位擴展,所以該值為0xff。對變量b進行無符號右移4位操作後轉換為byte型,將得到的值賦給變量d,你可能期望該值是0x0f,但實際上它是0xff,因為在移動之前變量b就被擴展為int型,已經有符號擴展位。最後一個表達式將變量b的值通過按位與運算將其變為8位,然後右移4位,然後將得到的值賦給變量e,這次得到了預想的結果0x0f。由於對變量d(它的值已經是0xff)進行按位與運算後的符號位的狀態已經明了,所以注意,對變量d再沒有進行無符號右移運算。

B = 0xf1

b 4 = 0xff

b 4 = 0xff

(b 0xff) 4 = 0x0f

位運算符賦值

所有的二進制位運算符都有一種將賦值與位運算組合在一起的簡寫形式。例如,下面兩個語句都是將變量a右移4位後賦給a:

a = a 4;

a = 4;

同樣,下面兩個語句都是將表達式a OR b運算後的結果賦給a:

a = a | b;

a |= b;

下面的程序定義了幾個int型變量,然後運用位賦值簡寫的形式將運算後的值賦給相應的變量:

class OpBitEquals {

public static void main(String args[]) {

int a = 1;

int b = 2;

int c = 3;

a |= 4;

b = 1;

c = 1;

a ^= c;

System.out.println(“a = ” + a);

System.out.println(“b = ” + b);

System.out.println(“c = ” + c);

}

}

該程序的輸出如下所示:

a = 3

b = 1

c = 6

java運算中&是什麼意思,比如a=1;b=2;a&b=多少

是位操作符,“按位與”;1轉成二進制 01;2轉成二進制 10;ab=00轉成十進制為0。

位運算符有:(按位與)、|(按位或)、^(按位異或)、~ (按位取反)。優先級從高到低,依次為~、、^、|。

按位與運算有兩種典型用法,一是取一個位串信息的某幾位,如以下代碼截取x的最低7位:x 0177。二是讓某變量保留某幾位,其餘位置0,如以下代碼讓x只保留最低6位:x = x 077。

Java 的表達式就是用運算符連接起來的符合Java 規則的式子,運算符的優先級決定了表達式中運算執行的先後順序。

擴展資料:

整數算術運算的異常是由於除零或按零取模造成的。它將引發一個算術異常。下溢產生零,上溢導致越界。例如:加1超過整數最大值,取模後,變成最小值。

一個op=賦值運算符,和上表中的各雙目整數運算符聯用,構成一個表達式。整數關係運算符,,=,=,==和!=產生boolean類型的數據。

JAVA位運算符

一般把位運算符和邏輯運算符一起說,

舉例:

邏輯運算符

位運算符

邏輯判斷的時候,if(isOk

isNotOk)

,如果isOk判斷為false,其結果就是false,不判斷isNotOk

位判斷的時候,

if(isOk

isNotOk),

即使isOk判斷為false,也還去判斷isNotOk,

然後再返回false

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/154574.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-16 14:13
下一篇 2024-11-16 14:13

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論