C位操縱示例
位運算可高效實現整數的底層操作,1. 檢查第i位是否為1:使用n & (1 0 && (n & (n-1)) == 0;6. 統計1的個數:使用n &= (n-1)循環清除末位1,最終返回計數,這些技巧廣泛應用於狀態壓縮、算法優化和集合操作中。
位運算(Bit Manipulation)在C 中是一種高效處理數據底層操作的技術,常用於優化性能、節省內存或實現算法。下面通過一個實用的例子來展示常見的位運算技巧。

✅ 示例:用位運算實現整數的常見操作
假設我們有一個整數,想通過位運算完成以下任務:
- 檢查某一位是否為1
- 設置某一位為1
- 將某一位清零
- 翻轉某一位
- 判斷是否為2 的冪
- 統計二進制中1 的個數
#include <iostream> using namespace std; // 1. 檢查第i 位是否為1(從右起第0 位開始) bool isBitSet(int n, int i) { return (n & (1 << i)) != 0; } // 2. 將第i 位設為1 int setBit(int n, int i) { return n | (1 << i); } // 3. 將第i 位清零int clearBit(int n, int i) { return n & ~(1 << i); } // 4. 翻轉第i 位int flipBit(int n, int i) { return n ^ (1 << i); } // 5. 判斷是否是2 的冪(正數且只有一個1) bool isPowerOfTwo(int n) { return n > 0 && (n & (n - 1)) == 0; } // 6. 統計二進制中1 的個數(Brian Kernighan 算法) int countSetBits(int n) { int count = 0; while (n) { n &= (n - 1); // 每次清除最低位的1 count ; } return count; } int main() { int num = 12; // 二進制: 1100 cout << "Number: " << num << " (binary: "; for (int i = 3; i >= 0; --i) { cout << ((num >> i) & 1); } cout << ")\n"; // 檢查第2 位是否為1 cout << "Bit 2 is set: " << isBitSet(num, 2) << endl; // 1 (true) // 設置第1 位num = setBit(num, 1); // 1100 -> 1110 (14) cout << "After setting bit 1: " << num << endl; // 清零第3 位num = clearBit(num, 3); // 1110 -> 0110 (6) cout << "After clearing bit 3: " << num << endl; // 翻轉第0 位num = flipBit(num, 0); // 0110 -> 0111 (7) cout << "After flipping bit 0: " << num << endl; // 判斷是否為2 的冪cout << "Is power of two: " << isPowerOfTwo(num) << endl; // 7 -> false // 統計1 的個數cout << "Number of set bits: " << countSetBits(12) << endl; // 12 -> 1100 -> 2 return 0; }
? 關鍵點說明
1 :創建一個只有第i 位為1 的掩碼。
-
&
:用於檢測位(與操作)。 -
|
:用於設置位(或操作)。 -
~
:按位取反,配合&
實現清零。 -
^
:異或,相同為0,不同為1,適合翻轉。 -
n & (n - 1)
:經典技巧,每次清除最右邊的1。
? 應用場景
- 狀態壓縮(如用一個int 表示多個布爾狀態)
- 哈希算法、加密算法
- 高效集合操作(如位圖)
- 算法題中判斷奇偶、交換變量(
a ^= b ^= a ^= b
)、去重等
基本上就這些。位操作看似底層,但掌握後能寫出更高效、更“酷”的代碼。

以上是C位操縱示例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

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

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

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

目錄什麼是Succinct(PROVE)誰創建了Succinct(PROVE)?哪些風險投資支持Succinct(PROVE)? Succinct(PROVE)的工作原理SP1zkVM和Prover網絡OPSuccinct技術跨鏈驗證PROVE代幣經濟學代幣詳情代幣分配代幣實用程序潛在代幣持有者PROVE代幣價格預測PROVE代幣的上市前交易活動社區對PROVE代幣價格的預測為什麼要選擇Succinct? Succ

刪除元素時若正在迭代,必須避免使用失效迭代器。 ①正確做法是使用it=vec.erase(it),利用erase返回的有效迭代器繼續遍歷;②批量刪除推薦“erase-remove”慣用法:vec.erase(std::remove_if(vec.begin(),vec.end(),條件),vec.end()),安全且高效;③可使用反向迭代器從後往前刪除,邏輯清晰但需注意條件方向。結論:始終用erase返回值更新迭代器,禁止對已失效迭代器執行 操作,否則導致未定義行為。

目錄什麼是Succinct(PROVE)哪些風險投資支持Succinct(PROVE)? Succinct(PROVE)的工作原理SP1zkVM和Prover網絡OPSuccinct技術跨鏈驗證PROVE代幣經濟學代幣詳情2025、2026、2027-2030年Succinct(PROVE)價格預測Succinct(PROVE)價格預測Succinct(PROVE)價格預測:交易量擴張和上市勢頭2025年至20

todebugac Application usinggdbinvisualStudiocode,configureTheLaunch.jsonFileCortly; keySettingSincludEstIncifyingTheexecutableWithWith program“ program”,將“ mimode”設置為“ gdb”和“ gdb”和“ type” type“ type” ty ty ty ty'cppdbg'to'cppdbg'ex

theAutokeywordInc decteStheTypeOfavariable fromitsInitializer,makecodecleanerandmoraintableable.1.itredreducesverbosity,尤其是withcomplextypeslikeiterators.2.itenhancesmaintainabilitionalobilitybyautaperaimatoragationalaimatoragationalapationalabilationalabilationalapationalapationalabilabilationalabilationalapationalabilationalapationalablemaintartaptingtopypechanges.3.ithicalemenderarefornelect

TagDispatching通過類型標籤在編譯期選擇最優函數重載,實現高效多態。 1.使用std::iterator_traits獲取迭代器類別標籤;2.定義多個do_advance重載函數,分別處理random_access_iterator_tag、bidirectional_iterator_tag和input_iterator_tag;3.主函數my_advance根據推導出的標籤類型調用對應版本,確保編譯期決策無運行時開銷;4.該技術被標準庫如std::advance採用,支持擴展自定義

使用std::ifstream的seekg和tellg方法可跨平台獲取文件大小,通過打開二進製文件並定位到末尾,利用tellg()返回字節數;2.C 17及以上推薦使用std::filesystem::file_size,代碼簡潔且通過異常處理錯誤,需啟用C 17標準;3.在POSIX系統上可使用stat()函數高效獲取文件大小,適用於性能敏感場景。應根據編譯器和平台選擇合適方法,優先使用std::filesystem(若可用),否則使用ifstream保證兼容性,或在Unix系統上使用st

該C 單鍊錶示例實現了插入、遍歷和刪除操作,1.使用insertAtBeginning在頭部插入節點;2.使用insertAtEnd在尾部插入節點;3.使用deleteNode按值刪除節點並返回布爾結果;4.通過display方法遍歷並打印鍊錶;5.在析構函數中釋放所有節點內存以防止洩漏;最終程序輸出驗證了這些操作的正確性,完整展示了動態數據結構的基本管理方式。
