Java運算符解密之位運算、移位運算舉例詳解
前言
位運算符是Java中的重要運算符之一,用于對數據的二進制位進行操作。Java中的位運算符包括按位與(&)、按位或(|)、按位取反(~)和按位異或(^)。這些運算符可以幫助我們進行位級操作,對于某些特定的問題解決方案非常有用。本文將深入探討Java中的位運算符的用法、規(guī)則以及注意事項,幫助讀者更好地理解和應用這些運算符。
一、位運算符
java 中數據存儲的最小單位是字節(jié),而數據操作的最小單位是比特位. 字節(jié)是最小的存儲單位,每個字節(jié)是由8個二進制比特位組成的,多個字節(jié)組合在一起可以表示各種不同的數據。
位運算符主要有四個: & | ~ ^ ,除 ~ 是一元運算符外,其余都是二元運算符。
位操作表示 按二進制位運算. 計算機中都是使用二進制來表示數據的(01構成的序列), 按位運算就是在按照二進制位的每一位依次進行計算。
1.1 按位與 &
按位與運算符(&)會對兩個整數的每一位進行比較。只有當兩個相應的位都是1時,結果中的該位才會是1,否則為0。這個操作常用于屏蔽某些位或檢查特定位是否設置。
int a = 10; int b = 20; System.out.println(a & b);
進行按位運算, 需要先把 10 和 20 轉成二進制, 分別為 1010 和 10100
1.2 按位或 |
如果兩個二進制位都是 0, 則結果為 0, 否則結果為 1
int a = 10; int b = 20; System.out.println(a | b);
運算方式和按位于類似
注意:
當 & 和 | 的操作數為整數(int, short, long, byte) 的時候, 表示按位運算, 當操作數為 boolean 的時候, 表示邏輯運算。
1.3 按位取反 ~
如果該二進制位為 0 則轉為 1, 如果該二進制位為 1 則轉為 0
int a = 0xf; System.out.printf("%x\n", ~a) //fffffff0
注意:
- 0x 前綴的數字為 十六進制 數字. 十六進制可以看成是二進制的簡化表示方式. 一個十六進制數字對應4個二進制位
- 0xf 表示 10 進制的 15, 也就是二進制的 1111
- printf 能夠格式化輸出內容, %x 表示按照十六進制輸出
- \n 表示換行符
1.4 按位異或^
按位異或運算符(^)會對兩個整數的每一位進行比較。如果兩個相應的位相同(都是0或都是1),則結果中的該位為0;如果兩個位不同,則結果為1。
int a = 0x1; int b = 0x2; System.out.printf("%x\n", a ^ b);
注意:如果兩個數相同,則異或的結果為0
二、移位運算符
移位運算符有三個: << >> >>> ,都是二元運算符,且都是按照二進制比特位來運算的。
1.1 左移<<
最左側位不要了, 最右側補 0
int a = 0x10; System.out.printf("%x\n", a << 1); // 運行結果(注意, 是按十六進制打印的) 20
注意:向左移位時,丟棄的是符號位,因此正數左移可能會變成負數
1.2 右移>>
最右側位不要了, 最左側補符號位(正數補0, 負數補1)
int a = 0x10; System.out.printf("%x\n", a >> 1); // 運行結果(注意, 是按十六進制打印的) 8 in t b = 0xffff0000; System.out.printf("%x\n", b >> 1); // 運行結果(注意, 是按十六進制打印的) ffff8000
1.3 無符號右移>>>
最右側位不要了, 最左側補 0
int a = 0xffffffff; System.out.printf("%x\n", a >>> 1); // 運行結果(注意, 是按十六進制打印的) 7fffffff
注意:
- 左移 1 位, 相當于原數字 * 2. 左移 N 位, 相當于原數字 * 2 的N次方.
- 右移 1 位, 相當于原數字 / 2. 右移 N 位, 相當于原數字 / 2 的N次方.
- 由于計算機計算移位效率高于計算乘除, 當某個代碼正好乘除 2 的N次方的時候可以用移位運算代替.
- 移動負數位或者移位位數過大都沒有意義
全篇總結
本篇詳細介紹了Java中的位運算符。位運算符包括按位與(&)、按位或(|)、按位取反(~)和按位異或(^),它們用于對數據的二進制位進行操作。通過位運算符,我們可以進行屏蔽位、檢查位狀態(tài)等處理,頻繁出現(xiàn)在底層編程、位運算加密等場景中。在使用這些運算符時,需要理解它們的運算規(guī)則,注意正負數的影響以及運算符的優(yōu)先級。通過合理運用這些運算符,能夠提高代碼的效率和性能,同時也解決一些特定問題。
到此這篇關于Java運算符解密之位運算、移位運算的文章就介紹到這了,更多相關Java位運算移位運算內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot Web詳解靜態(tài)資源規(guī)則與定制化處理
這篇文章主要介紹了SpringBoot web場景的靜態(tài)資源規(guī)則與定制化,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06Mybatis分頁插件PageHelper的配置和簡單使用方法(推薦)
在使用Java Spring開發(fā)的時候,Mybatis算是對數據庫操作的利器了。這篇文章主要介紹了Mybatis分頁插件PageHelper的配置和使用方法,需要的朋友可以參考下2017-12-12Java微信公眾平臺開發(fā)(7) 公眾平臺測試帳號的申請
這篇文章主要為大家詳細介紹了Java微信公眾平臺開發(fā)第七步,微信公眾平臺測試帳號的申請,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04MybatisPlus創(chuàng)建時間不想用默認值的問題
MybatisPlus通過FieldFill注解和MpMetaObjectHandler類支持自動填充字段功能,特別地,可以設置字段在插入或更新時自動填充創(chuàng)建時間和更新時間,但在特定場景下,如導入數據時,可能需要自定義創(chuàng)建時間2024-09-09Spring?Boot?Nacos?實現(xiàn)不停服發(fā)布過程詳解
這篇文章主要為大家介紹了Spring?Boot?Nacos實現(xiàn)不停服發(fā)布過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05