首頁 Java Java入門 java中的位元運算及應用場景介紹

java中的位元運算及應用場景介紹

Mar 08, 2021 pm 04:32 PM
java 位元運算 應用場景

java中的位元運算及應用場景介紹

我們知道程式中的所有數在電腦記憶體中都是以二進位的形式儲存的,而位元運算就是直接對整數在記憶體中的二進位位元進行操作。例如,and運算本來就是邏輯運算符,但整數與整數之間也可以進行and運算。

位元運算主要有移位運算和邏輯運算。下面我們就分別來講講移位運算和邏輯運算。

移位運算:

左移:運算子為<<,向左移動,右邊的低位補0,左邊高位捨棄,將二進位看做整數,左移1位就相當於乘以2。無符號右移:運算子為>>>,向右移動,右邊的捨棄掉,左邊補0。有符號右移:操作符為>>,向右移動,右邊的捨棄掉,左邊補的值取決於原來最高位,原來是1就補1,原來是0就補0,將二進位看做整數,右移1位相當於除以2。

例如:

int a = 4; // 100
a = a >> 2; // 001,等于1
a = a << 3 // 1000,变为8
登入後複製

邏輯運算有:

  • #位元與&:兩位都為1才為1

  • 按位元或|:只要有一位為1,就為1

  • #位元取反~: 1變成0,0變成1

  • 按位異或^ :相異為真,相同為假

例如:

int a = ...; 
a = a & 0x1 // 返回0或1,就是a最右边一位的值。
a = a | 0x1 //不管a原来最右边一位是什么,都将设为1
登入後複製

我們來看幾個簡單的應用場景:

場景一:判斷奇偶

分析:奇數都不是2的整數倍,轉換成二進位後最低位必然為1,偶數則相反。利用這個特性我們可以很容易的通過位運算判斷一個整數的奇偶性。

看程式碼:

   int i = 1;// 二进制存储方式为00000000000000000000000000000001
    int j = 5;// 二进制存储方式为00000000000000000000000000000101
    int k = 6;// 二进制存储方式为00000000000000000000000000000110
    if ((i & j) == 1) {
      System.out.println("j的最低位为1,为奇数");
    }    if ((i & k) == 0) {
      System.out.println("k的最低位为0,为偶数");
    }
登入後複製

場景二:判斷一個正整數是不是2的整數次方

分析:我們先來看看常見的2的整數次冪的數:2、4、8、16,轉換成二進位依序為:10、100、1000、10000,發現規律了沒有?那就是除了首位是1,其他全是0。恰巧這些數減去1後等於他們依序按位取反的結果,例如8-1=7,二進制是111,可以透過8的二進制1000按位取反得到。而8&7=0,提取一下規律就是:

(n&(n-1))==0
登入後複製

符合這個規律的n就是2的整數次方了。

(學習影片分享:java影片教學

場景三:簡單的集合處理

不廢話,直接看程式碼:

public class SimpleSet {  public static final int A = 0x01;// 最后四位为0001
  public static final int B = 0x02;// 最后四位为0010
  public static final int C = 0x04;// 最后四位为0100
  public static final int D = 0x08;// 最后四位为1000
  private int set = 0x00;// 初始0000,空集合
  public void add(int i) {// 将i对应位的值置为1,重复add不影响。默认传入值为ABCD之一,此处省去边界判断
    set |= i;
  }  public boolean contain(int i) {// 判断相应位置是否为1
    return (set & i) == i;
  }  public boolean remove(int i) {// 来不及不解释了快看代码
    if (contain(i)) {
      set -= i;      return true;
    } else {      return false;
    }
  }
}
登入後複製

測試一下:

 public static void main(String[] args) {
    SimpleSet set = new SimpleSet();
    System.out.println(set.contain(A));
    set.add(B);
    System.out.println(set.contain(A));
    System.out.println(set.contain(B));
    set.add(A);
    set.add(C);
    System.out.println(set.contain(A));
    set.remove(A);
    System.out.println(set.contain(A));
    System.out.println(set.remove(A));
    System.out.println(set.contain(C));
  }
登入後複製

輸出為:

false
false
true
true
false
false
true
登入後複製

好的,沒有問題。

大家可能會覺得,上面的範例程式碼中的A、B、C、D有點類似枚舉,事實上jdk原始碼中的關於枚舉的集合類別EnumSet使用的就是類似的方案,當然比這個複雜得多,有興趣的可以去翻一下源碼,這個方案它有個名字,叫位向量。

順便提一句,java中int的包裝類別Integer裡面有很多靜態工具方提供位元運算操作,而且大都十分複雜,有興趣的可以去看看

結語:

位元運算是電腦最擅長的運算,jdk的原始碼中也大量使用了它,搞清楚它有助於我們更深入的理解計算機,也有助於我們寫出更優雅的程式碼​​。 

相關推薦:java入門教學

#

以上是java中的位元運算及應用場景介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

Java 完美數指南。這裡我們討論定義,如何在 Java 中檢查完美數?

Java 中的隨機數產生器 Java 中的隨機數產生器 Aug 30, 2024 pm 04:27 PM

Java 隨機數產生器指南。在這裡,我們透過範例討論 Java 中的函數,並透過範例討論兩個不同的生成器。

Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

Java 版 Weka 指南。這裡我們透過範例討論簡介、如何使用 weka java、平台類型和優點。

Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

Java 史密斯數指南。這裡我們討論定義,如何在Java中檢查史密斯號?帶有程式碼實現的範例。

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java 中的時間戳至今 Java 中的時間戳至今 Aug 30, 2024 pm 04:28 PM

Java 中的時間戳記到日期指南。這裡我們也結合範例討論了介紹以及如何在java中將時間戳記轉換為日期。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

See all articles