位運算應用和工具

来源:http://www.cnblogs.com/hvicen/archive/2016/12/24/6216488.html
-Advertisement-
Play Games

有時需要追求效率,會代替一些算術運算。 求商:a >> n <=> a / 2^n 求積:a << n <=> a * 2^n 求餘:a & ((1 << n) - 1) <=> a % 2^n 奇偶判斷:a & 1 == 1 <==> a % 2 == 1 一般1表示選中或者開啟項,0表示未選或者 ...


有時需要追求效率,會代替一些算術運算。

  • 求商:a >> n  <=>  a / 2^n
  • 求積:a << n  <=>  a * 2^n
  • 求餘:a & ((1 << n) - 1)  <=>  a % 2^n
  • 奇偶判斷:a & 1 == 1  <==>  a % 2 == 1

 

一般1表示選中或者開啟項,0表示未選或者關閉項。

  • 獲取全部項:(1 << n) - 1
  • 獲取指定項:1 << idx
  • 獲取反選項:~a
  • 開啟指定項:a |= b
  • 合併兩選項:a | b
  • 關閉指定項:a &= ~b
    說明:a中的項,遇到1時變0,遇到0時不變。
  • 查看公共項:a & b
  • 保留指定項:a &= b
    說明:a中的項,遇到0時變0,遇到1時不變。
  • 切換指定項:a ^= b
    說明:a中的項,遇到0時不變,遇到1時變化,0變1,1變0。
  • 查看改變項:a1 ^ a2
    說明:a1是變化前,a2是變化後,a1 ^ a2就可以計算出前後的變化項。
  • 查看未變項:~(a1 ^ a2) = ~a1 ^ a2 = a1 ^ ~a2

 

輸出組合,如下示例,輸出abcd的組合。

public static void main(String[] args) {
    char[] chars = "abcd".toCharArray();
    int len = chars.length;
    
    int bits = (1 << len) - 1;
    for (int i = bits; i > 0 ; i = (i - 1) & bits) {
        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();
    }
}

輸出結果:

1111:abcd
1110:bcd
1101:acd
1100:cd
1011:abd
1010:bd
1001:ad
1000:d
 111:abc
 110:bc
 101:ac
 100:c
  11:ab
  10:b
   1:a

 

位移註意事項:

  • >>是帶符號右移,即正數時左邊補0,負數時左邊補1。
  • >>>是無符號右移,即總是左邊補0。

 

Long.bitCount(long),Integer.bitCount(int):計算1的數量。

BitSet:用於表示可以比long更長的存儲位數。

  • int cardinality(),計算1的數量。
  • and(BitSet),與運算,即保留指定項,a &= b。boolean intersects(BitSet),判斷是否存在公共項。
  • or(BitSet),或運算,即開啟指定項,a |= b。
  • xor(BitSet),異或運算,切換指定項,即a ^= b。flip(...),切換指定項,即a ^= b。
  • andNot(BitSet),與非運算,即關閉目標項,a &= ~b。
  • int length(),獲取長度。boolean isEmpty(),判斷長度是否為0。
  • set(...),開啟指定項。clear(...),關閉指定項。set(..., boolean),設置指定項的值。clear(),關閉所有項,並清空,即長度重置為0。
  • boolean get(int),獲取指定項的開關值。
  • int previousSetBit(int)/int nextSetBit(int):從指定位置開始查找上一個/下一個開啟項的索引。
  • int previousClearBit(int)/int nextClearBit(int):從指定位置開始查找上一個/下一個關閉項的索引。
  • BitSet get(int, int):截取子集。
  • 構造:s+valueOf(ByteBuffer/byte[]/LongBuffer/long[])
  • 轉換:toLongArray()/toByteArray()

參考文章:http://blog.csdn.net/u011039332/article/details/49967559

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • private void button1_Click(object sender, EventArgs e) { double number1, number2; if (double.TryParse(txtNumber1.Text, out number1) == false) { Messag... ...
  • web部件是ASP.NET WebForm裡面的伺服器控制項,它涵蓋的內容比較多,鑒於這種狀況的話鄙人不打算深究下去了,只是局限於瞭解web.config配置裡面的配置內容則可。 那麼也得稍微說說啥是Web部件。引用MSDN的話:ASP.NET Web 部件是一組集成控制項,用於創建網站使最終用戶可以直 ...
  • 在上一篇C#多線程之線程同步2中,我們主要學習了AutoResetEvent構造、ManualResetEventSlim構造和CountdownEvent構造,在這一篇中,我們將學習Barrier構造、ReaderWriterLockSlim構造和SpinWait構造。 七、使用Barrier構造 ...
  • #region 發送郵件 //填寫電子郵件地址,和顯示名稱 System.Net.Mail.MailAddress from = new System.Net.Mail.MailAddress("[email protected]", "wode"); //填寫郵件的收件人地址和名稱 ... ...
  • 瞭解過入口函數 Main() 嗎?帶你用批處理玩轉 Main 函數 目錄 簡介 特點 方法的參數 方法的返回值 與批處理交互的一個示例 簡介 我們知道,新建一個控制台應用程式的時候,IDE 會同時創建一個預設的類 Program.cs,該類會包含一個 Main 方法。我們在直接 F5 的時候就會立即 ...
  • 1、ViewBag Controller:ViewBag.Message = "Hello, Word"; View:@ViewBag.Message 註:ViewBag的類型是動態的,不確定的,直接就可以使用,它的傳值範圍是:controller向view傳值,view自己和自己傳值。2、View ...
  • 實現效果如下: 1.在前臺Web的Category Menu顯示 Vendor; 2.點擊Vendor 顯示Vendor List列表; 主要配置步驟: 1.運行網站 Admin 後臺 Categorys 增加 Vendor 並配置其SEO 如vendor-all 2.代碼層面 Nop.Web In ...
  • 然ASP.NET Core應用的路由是通過RouterMiddleware這個中間件來完成的,但是具體的路由解析功能都落在指定的Router對象上,不過我們依然有必要以代碼實現的角度來介紹一下這個中間件。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...