一文讓你徹底學(xué)會(huì)Java左移、右移操作
在Java中,左移 ( <<
) 和右移 ( >>
) 是位運(yùn)算符,用于對(duì)二進(jìn)制數(shù)進(jìn)行移位操作。移位操作會(huì)對(duì)數(shù)字的位模式進(jìn)行直接操作。
1. 左移運(yùn)算符(<<)
功能:
- 左移操作會(huì)將一個(gè)數(shù)字的二進(jìn)制位向左移動(dòng)指定的位數(shù),右邊用 0 填充。
- 每向左移動(dòng)一位,相當(dāng)于該數(shù)字乘以2(但不是嚴(yán)格意義上的乘法,可能會(huì)導(dǎo)致溢出)。
語(yǔ)法:
result = value << n;
value
是要操作的數(shù)字。n
是移動(dòng)的位數(shù)。
特點(diǎn):
- 左移后會(huì)擴(kuò)大數(shù)字的值(如果沒有溢出的話)。
- 右邊補(bǔ)0。
- 如果是負(fù)數(shù),二進(jìn)制會(huì)以補(bǔ)碼形式參與計(jì)算。
示例:
int a = 5; // 二進(jìn)制:00000000 00000000 00000000 00000101 int result = a << 2; // 左移2位:00000000 00000000 00000000 00010100(20) System.out.println(result); // 輸出:20
2. 右移運(yùn)算符(>>)
功能:
- 右移操作會(huì)將一個(gè)數(shù)字的二進(jìn)制位向右移動(dòng)指定的位數(shù)。
- 符號(hào)位擴(kuò)展:如果是正數(shù),高位用0填充;如果是負(fù)數(shù),高位用1填充(即符號(hào)位保持不變)。
- 每向右移動(dòng)一位,相當(dāng)于該數(shù)字除以2(向下取整)。
語(yǔ)法:
result = value >> n;
value
是要操作的數(shù)字。n
是移動(dòng)的位數(shù)。
特點(diǎn):
- 對(duì)于正數(shù),右移后高位用0填充。
- 對(duì)于負(fù)數(shù),右移后高位用1填充(符號(hào)位擴(kuò)展)。
- 適合處理帶符號(hào)的數(shù)字。
示例:
int a = 20; // 二進(jìn)制:00000000 00000000 00000000 00010100 int result = a >> 2; // 右移2位:00000000 00000000 00000000 00000101(5) System.out.println(result); // 輸出:5 int b = -20; // 二進(jìn)制:11111111 11111111 11111111 11101100(補(bǔ)碼表示) int result2 = b >> 2; // 右移2位:11111111 11111111 11111111 11111011(-5) System.out.println(result2); // 輸出:-5
3. 無(wú)符號(hào)右移運(yùn)算符(>>>)
除了 >>
,Java 還提供了 無(wú)符號(hào)右移運(yùn)算符 >>>
:
- 無(wú)論正數(shù)還是負(fù)數(shù),高位都用 0 填充。
- 通常用于操作無(wú)符號(hào)數(shù)據(jù)。
示例:
int a = -20; // 二進(jìn)制:11111111 11111111 11111111 11101100(補(bǔ)碼表示) int result = a >>> 2; // 無(wú)符號(hào)右移2位:00111111 11111111 11111111 11111011 System.out.println(result); // 輸出:1073741819
總結(jié)
操作符 | 名稱 | 功能 |
---|---|---|
<< | 左移 | 二進(jìn)制向左移,右邊補(bǔ)0,相當(dāng)于乘以2的n次方(如果不溢出)。 |
>> | 符號(hào)右移 | 二進(jìn)制向右移,保留符號(hào)位,高位補(bǔ)符號(hào)位(正數(shù)補(bǔ)0,負(fù)數(shù)補(bǔ)1),相當(dāng)于除以2的n次方。 |
>>> | 無(wú)符號(hào)右移 | 二進(jìn)制向右移,高位總是補(bǔ)0,不考慮符號(hào)位。 |
擴(kuò)展:i <<= j
- 在Java中,
i <<= j
是一個(gè)復(fù)合運(yùn)算符,它等價(jià)于i = i << j
,表示將i
的二進(jìn)制位向左移動(dòng)j
位,然后將結(jié)果賦值給i
。即將i
左移j位,相當(dāng)于i
乘以2
的j
次方。
運(yùn)算過(guò)程
i
的二進(jìn)制形式會(huì)向左移動(dòng)j
位。- 移位后,低位用 0 補(bǔ)充,高位可能會(huì)溢出(超出當(dāng)前數(shù)據(jù)類型范圍的部分會(huì)被丟棄)。
- 最終結(jié)果存回變量
i
。
示例
示例1:對(duì)正數(shù)進(jìn)行左移
public class Main { public static void main(String[] args) { int i = 5; // 二進(jìn)制:00000000 00000000 00000000 00000101 int j = 2; i <<= j; // 等價(jià)于 i = i << j // 左移2位:00000000 00000000 00000000 00010100 (20) System.out.println(i); // 輸出:20 } }
示例2:對(duì)負(fù)數(shù)進(jìn)行左移
public class Main { public static void main(String[] args) { int i = -5; // 二進(jìn)制(補(bǔ)碼):11111111 11111111 11111111 11111011 int j = 2; i <<= j; // 等價(jià)于 i = i << j // 左移2位:11111111 11111111 11111111 11101100 (-20) System.out.println(i); // 輸出:-20 } }
示例3:可能的溢出問題
public class Main { public static void main(String[] args) { int i = 1073741824; // 二進(jìn)制:01000000 00000000 00000000 00000000 int j = 1; i <<= j; // 左移1位:10000000 00000000 00000000 00000000 // 超過(guò)32位,結(jié)果變?yōu)樨?fù)數(shù)(溢出) System.out.println(i); // 輸出:-2147483648 } }
注意點(diǎn)
左移等價(jià)于乘以2的冪:
- 每向左移1位,相當(dāng)于乘以
2
。 - 例如:
5 <<= 1
等價(jià)于5 * 2 = 10
,5 <<= 2
等價(jià)于5 * 4 = 20
。 - 注意,左移不會(huì)檢查溢出問題,可能導(dǎo)致負(fù)數(shù)或錯(cuò)誤的結(jié)果。
- 每向左移1位,相當(dāng)于乘以
溢出問題:
- 移位可能會(huì)導(dǎo)致高位被截?cái)?,特別是當(dāng)操作數(shù)接近數(shù)據(jù)類型的最大值時(shí)。
適用數(shù)據(jù)類型:
- 左移操作支持整型和長(zhǎng)整型(
int
和long
)。 - 如果操作的類型小于
int
(比如byte
或short
),會(huì)被提升為int
再執(zhí)行移位運(yùn)算。
- 左移操作支持整型和長(zhǎng)整型(
總結(jié)
到此這篇關(guān)于Java左移、右移操作的文章就介紹到這了,更多相關(guān)Java左移、右移操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kafka?日志存儲(chǔ)實(shí)現(xiàn)過(guò)程
這篇文章主要為大家介紹了Kafka?日志存儲(chǔ)的實(shí)現(xiàn)過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Spring Boot 3.x 集成 Eureka Server/Cl
隨著SpringBoot 3.x版本的開發(fā)嘗試,本文記錄了在集成Eureka Server/Client時(shí)所遇到的問題和解決方案,文中詳細(xì)介紹了搭建服務(wù)、配置文件和測(cè)試步驟,感興趣的朋友跟隨小編一起看看吧2024-09-09關(guān)于Spring中@Value注解使用和源碼分析
通過(guò)深入分析@Value注解的使用和源碼,本文詳細(xì)解釋了Spring如何解析@Value注解并為屬性賦值,首先,Spring會(huì)解析并收集所有被@Value注解修飾的屬性,這一過(guò)程依賴于AutowiredAnnotationBeanPostProcessor類2024-11-11Java實(shí)現(xiàn)簡(jiǎn)易購(gòu)物系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)易購(gòu)物系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05java實(shí)現(xiàn)發(fā)送email小案例
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)發(fā)送email小案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02