首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

位運算實戰寶典:高效算術替換、標誌位操作與 BitSet 進階用法

     編輯:Java 綜合教學

基礎算術替換(2 的冪次場景)

操作位運算等價算術適用條件
除法取商a >> na / 2^n正數、2 的冪次除數
乘法a << na * 2^n無溢出風險
取模a & ((1 << n) - 1)a % 2^n正數、2 的冪次模數
奇偶判斷(a & 1) == 1a % 2 == 1整數

標誌位操作模式(1=開啟/選中,0=關閉/未選)

需求位運算表達式口訣
全選掩碼(1 << n) - 1n 位全 1
單個位掩碼1 << idx第 idx 位為 1
反選~a按位取反
開啟指定位a |= b或賦值
合併兩組選項a | b按位或
關閉指定位a &= ~b與非賦值:遇 1 變 0
查看公共項a & b按位與
保留指定位a &= b與賦值:遇 0 變 0
切換指定位a ^= b異或賦值:遇 1 翻轉
查看變化位a1 ^ a2前後異或
查看不變位~(a1 ^ a2)變化位取反

組合輸出實戰:生成 "abcd" 所有非空子集

public static void main(String[] args) {
    char[] chars = "abcd".toCharArray();
    int len = chars.length;
    int all = (1 << len) - 1;           // 1111
    for (int i = all; i > 0; i = (i - 1) & all) { // 灰碼遍歷所有子集
        System.out.printf("%" + len + "s:", Integer.toBinaryString(i));
        for (int j = 0; j < len; j++) {
            if (((i >> j) & 1) == 1) System.out.print(chars[j]);
        }
        System.out.println();
    }
}

輸出:從 abcd 遞減至 a,共 15 種組合。

移位陷阱與工具類

  • 符號右移 >>:正數補 0,負數補 1(保持符號)。
  • 無符號右移 >>>:始終補 0。

JDK 內置工具:

  • Integer.bitCount(int) / Long.bitCount(long) — 統計 1 的個數(人口計數)。
  • java.util.BitSet — 突破 64 位限制的動態位向量,核心方法:
方法對應位運算說明
cardinality()bitCount1 的個數
and(bs)&=保留公共位
or(bs)|=合併開啟位
xor(bs) / flip()^=翻轉指定位
andNot(bs)&= ~關閉目標位
get/set/clear(index)單位操作讀/寫/清除指定位
previous/nextSetBit()—查找前/後一個 1 的索引
toLongArray()/toByteArray()—序列化輸出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved