我愛學算法之—— 位運算(上)

常見位運算

對于位運算:

&:按位與,有00

|:按位或,有11

^:按位異或,相同為0、不同為1。(無進位相加)

~:二進制位按位取反。

對于位運算的常見使用:

1. 判斷一個數n,二進制中第x位是0還是1

例如一個數n01001101,要判斷第4位是0還是1(從低位數)

就可讓01001101 按位與上00001000,這樣如果第4位為0,結果就是0;如果第4位為1,結果就是1

所以,就可以判斷**(n>>x) & 1**,結果為1就表示第x1;結果為0則表示第x位為0

2. 將一個數n,二進制第x位修改為1

例如一個數n01100100,要將第4位修改為1

就可以讓01100100按位或上00001000,這里無論第4位是0還是1,結果都是1;而其他位異或上0都不變(1 | 0 = 10 | 0 = 0)。

00001000只需讓1左移3位即可。

所以,修改二進制第x1,只需:n | (1<<x)

3. 將一個數n,二進制第x位修改為0

例如一個數n00101100,將第4位修改為0

就可以讓00101100按位與上11110111;這樣無論第4位是什么,結果都為1,而其他位按位與上1都不變(1 & 1 = 10 & 1 = 0

11110111,只需要讓1左移4位,然后按位取反即可。

4. 位圖

對于位圖,簡單來說就是使用一個bit位來表示狀態(01

5. 提取一個數n二進制中最右側的1

要提取一個數n二進制中最右側的1,只需要n & (-n)即可。

例如:n01100100,而-n的補碼(原碼取反加一):10011011(取反)、10011100(加一)

通過觀察,取反加一,就是最右側的1的右側不變,左側取反。(右側為0),再按位與即可提取最右側的1

01100100 & 10011011結果就等于00000100

6. 去掉一個數n二進制中最右側的1

有去掉一個數n二進制中最右側的1,只需要n & (n-1)即可

例如n01011000,而n-1 : 01010111

通過觀察,n-1本質就是讓n最右側1的右側取反(由全0變全1),左側不變;

再按位與,右側結果都為0(和n一樣);而左側沒有變化。

01011000 & 01010111 結果為01010000

7. 按位異或

對于按位異或,常見的使用:

  1. n ^ n = 0
  2. n ^ 0 = n
  3. a ^ b ^ c = a ^ (b ^ c)(支持交換律)

一、位1的個數

在這里插入圖片描述

對于這道題,要獲取一個數n二進制中設置位的個數(1的個數)

而我們可以通過n & (n - 1)的操作來去掉n二進制中最后的1,所以,就可以對n一直進行n = n & (n - 1)操作,直到n0

n &= (n - 1)的次數就是數n二進制中1的個數。

class Solution {
public:int hammingWeight(int n) {int ret = 0;while (n) {n &= (n - 1);ret++;}return ret;}
};

二、比特位計數

在這里插入圖片描述

這道題,給定一個n要求,返回一個數組ansans中存儲的是[0 , n]之間每個數二進制形式中1的個數。

簡單來說就是,獲取[0,n]中每個數二進制中1的個數。

class Solution {
public:vector<int> countBits(int n) {vector<int> ans;for (int i = 0; i <= n; i++) {int tmp = i;int cnt = 0;while (tmp) {tmp &= (tmp - 1);cnt++;}ans.push_back(cnt);}return ans;}
};

三、漢明距離

在這里插入圖片描述

對于這道題,給兩個數xy,要求xy的漢明距離(二進制中不同位的數目)

簡單來說就是求xy二進制中,不同bit位置的數目。

解題思路:

我們知道^操作,相同為0,不同為1;所以,x ^ y二進制中為1就表示xybit為不相同。

只需要判斷x^y的二進制中1的個數即可。

class Solution {
public:int hammingDistance(int x, int y) {int tmp = x ^ y;int ret = 0;while (tmp) {tmp &= (tmp - 1);ret++;}return ret;}
};

四、只出現一次的數字

在這里插入圖片描述

這道題,給定一個非空的數組nums,其他有一個元素只出現了一次,其他元素都出現了兩次。

^操作:

  • n ^ 0 = n
  • n ^ n = 0

這里只需要將nums中所有元素都進行^即可,最終的結果就是只出現一次的元素(其他所有元素都出現了兩次,^結果為0

class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for (auto& e : nums) {ret ^= e;}return ret;}
};

五、只出現一次的數字 III

在這里插入圖片描述

這道題給定一個數組nums,其中存在兩個元素只出現了一次,其他所有的元素都出現了兩次;

這里要我們返回這兩個主出現了一次的元素。

解法一:

使用hash表統計數組中的元素和出現的次數;最后找出只出現一次的兩個元素,然后返回。

解法二:

假設只出現的元素為xy,將數組中的所有元素進行^,最終結果為:x ^ y

  • 提取x ^ y二進制bit位最低位的1lowbit
  • (x ^ y)該bit位為1xybit位不相同(通過該bit位將xy區分開)
  • 再遍歷nums數組,lowbit1的為一組,lowbit0的為一組(xy一定不在同一組)。
  • 獲取xy,然后返回

在這里插入圖片描述

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {int n = 0;for (auto& e : nums)n ^= e;int lowbit = (n == INT_MIN ? n : n & -n);vector<int> ret(2, 0);for (auto& e : nums) {if (e & lowbit) // 1ret[0] ^= e;elseret[1] ^= e;}return ret;}
};

我的博客即將同步至騰訊云開發者社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/bicheng/96931.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96931.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96931.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能語音系統

智能語音系統通過技術手段讓機器能夠“聽懂”、“理解”并“回應”人類的語音&#xff0c;是實現人機交互的關鍵技術之一。下面我將為你梳理智能語音系統的核心組成部分、工作原理、應用場景以及面臨的挑戰。&#x1f9e0; 核心技術與工作原理智能語音系統之所以能實現人機交互…

水泵自動化遠程監測與控制的御控物聯網解決方案

一、行業背景與痛點分析水泵作為工業生產、農業灌溉、城市供水等領域的核心設備&#xff0c;其運行效率直接影響系統穩定性與運營成本。然而&#xff0c;傳統管理模式存在三大核心痛點&#xff1a;人工巡檢低效&#xff1a;偏遠地區水泵分布分散&#xff0c;依賴人工定期巡檢&a…

Python實現點云法向量各種方向設定

本次我們分享點云法向量定向的四種方法&#xff0c;分別是XYZ軸、相機位置、最小生成樹(MST)和質心設定方法。通常出現在三維點云處理、三維重建、計算機視覺或圖形學中&#xff0c;需要估計點云的法向量方向。它們的核心任務是&#xff1a;在已知點坐標和局部幾何結構&#xf…

騰訊云智能體開發平臺

提供全球領先的云計算服務騰訊云&#xff0c;騰訊集團傾力打造的云計算品牌&#xff0c;面向全世界各個國家和地區的政府機構、企業組織和個人開發者&#xff0c;提供全球領先的云計算、大數據、人工智能等技術產品與服務&#xff0c;以卓越的科技能力打造豐富的行業解決方案&a…

css flex布局,設置flex-wrap:wrap換行后,如何保證子節點被內容撐高后,每一行的子節點高度一致。

flex布局&#xff0c;設置flex-wrap&#xff1a;wrap換行后&#xff0c;如何保證子節點被內容撐高后&#xff0c;每一行的子節點高度一致。核心&#xff1a;需要設置父節點和子節點&#xff1a;align-items: stretch&#xff0c;兩個都要。代碼&#xff1a;<div class"…

Nginx_Tomcat綜合案例

要求 需求&#xff1a;通過 nginx 來代理兩個 tomcat 服務器&#xff08;反向代理&#xff09;&#xff0c;然后通過 https://www.nginx.com 來進行訪問。主機名IP軟件nginx192.168.30.10nginxtomcat1192.168.30.11java&#xff0c;tomcattomcat2192.168.30.12java&#xff0c;…

【Vue2手錄12】單文件組件SFC

一、知識回顧-Vue2項目基礎操作與環境配置 1.1 項目啟動 項目打開方式&#xff1a;直接將項目文件夾&#xff08;如my-app&#xff09;拖拽到 Visual Studio Code&#xff08;推薦編輯器&#xff09;&#xff0c;避免拖拽父級文件夾&#xff0c;防止路徑混亂。啟動命令&#xf…

VS2022下載+海康SDK環境配置實現實時預覽

一.VS2022下載去官網下載就可以了&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/下載Community版本是免費的。&#xff08;2&#xff09;下載后得安裝包VisualStudioSetup.exe打開&#xff1a;點擊繼續等待下載完成&#xff0c;出現如下界面&#xff0c;這里是選…

YOLO 模型從 PyTorch 轉換為 ONNX 并優化

YOLO 模型從 PyTorch 轉換為 ONNX 并優化 在深度學習部署中&#xff0c;ONNX&#xff08;Open Neural Network Exchange&#xff09; 已成為跨框架與跨平臺的標準格式。我們經常需要將 YOLOv8 在 PyTorch 中訓練好的模型轉換為 ONNX&#xff0c;并進行優化&#xff0c;以便在 …

推進新型信息基礎設施建設發展:蜂窩模組行業迎來結構性機遇

工信部副部長張云明在2025年9月9日國新辦新聞發布會上明確表示&#xff0c;將"扎實推進新型信息基礎設施建設發展"&#xff0c;并重點強調"打造新型工業網絡&#xff0c;推進蜂窩車聯網部署" 。這一政策表態對蜂窩模組行業產生深遠影響&#xff0c;將推動行…

返利app排行榜的緩存更新策略:基于過期時間與主動更新的混合方案

返利app排行榜的緩存更新策略&#xff1a;基于過期時間與主動更新的混合方案 大家好&#xff0c;我是阿可&#xff0c;微賺淘客系統及省賺客APP創始人&#xff0c;是個冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在返利APP中&#xff0c;“熱門商品排行榜”“用…

科技信息差(9.12)

AI量子計算重塑藥物研發&#xff1a;技術融合路徑與產業革命一、引言&#xff1a;技術融合的顛覆性機遇2025年9月&#xff0c;AI藥物研發公共服務平臺正式上線&#xff0c;宣稱可將新藥上市時間縮短近半1。與此同時&#xff0c;量子計算與AI的跨界合作在KRAS抑制劑開發中取得突…

Java 分布式緩存實現:結合 RMI 與本地文件緩存

目錄 一、核心思路 二、項目結構說明 2.1 服務端項目結構&#xff08;IDEA&#xff09; 2.2 客戶端項目結構&#xff08;Eclipse&#xff09; 三、服務端實現&#xff08;IDEA&#xff09; 3.1 數據庫訪問層 3.2 遠程接口定義 3.3 遠程服務實現 3.4 服務端啟動類 四、…

Electron第一個應用

1、安裝node nodeJS下載 2、下載完成&#xff0c;需要配置環境。 寫道path路徑 、 3、安裝完成&#xff0c;查看版本 npm -v4、 配置cnpm npm install -g cnpm --registryhttps://registry.npmmirror.com5、參考Electron 寫&#xff1a; Electron第一個程序hello 6、安裝…

React 原理篇 - React 新架構深度解析

使用過 React v16 之前版本的開發者或許都經歷過這樣的場景&#xff1a;當頁面包含復雜組件或大量列表時&#xff0c;輸入框打字會卡頓&#xff0c;滾動會不流暢。這些體驗問題的背后&#xff0c;往往與 React 的渲染機制密切相關。2017 年 React v16 推出的 Fiber 架構&#x…

【JavaSE五天速通|第三篇】常用API與日期類篇

適合有其他語言基礎想快速入門JavaSE的。用的資料是 Java入門基礎視頻教程 &#xff0c;從中摘取了筆者認為與其他語言不同或需要重點學習的內容 常用API與日期類只需要有印象即可&#xff0c;用到了再來這查 day04 常用API 一、StringBuilder類 StringBuilder代表可變字符…

K8s學習筆記(二) Pod入門與實戰

1 K8s核心資源Pod 1.1 Pod是什么&#xff1f; 官方文檔&#xff1a;Pod | Kubernetes Pod 是 Kubernetes&#xff08;k8s&#xff09;中最小的部署與調度單元&#xff0c;并非直接運行容器&#xff0c;而是對一個或多個 “緊密關聯” 容器的封裝。 核心特點可簡單總結為 3 …

用 Python 調用 Bright Data MCP Server:在 VS Code 中實現實時網頁數據抓取

用 Python 調用 Bright Data MCP Server&#xff1a;在 VS Code 中實現實時網頁數據抓取&#xff0c;本文介紹了Bright Data的Web MCP Server&#xff0c;這是一款能實現實時、結構化網頁數據訪問的API&#xff0c;適用于AI應用等場景。其支持靜態與動態網頁&#xff0c;前3個月…

SPSS繪制ROC曲線并計算靈敏度、特異度

SPSS繪制ROC曲線并計算靈敏度、特異度。 &#xff08;1&#xff09;繪制ROC曲線&#xff1a; 輸入&#xff1a;預測值、受試者標簽。 在SPSS中點擊“分析”-“分類”-“ROC曲線” 變量輸入&#xff1a;檢驗變量輸入預測值&#xff0c;狀態變量輸入受試者標簽&#xff0c;如果標…

Modbus協議原理與Go語言實現詳解

目錄 Modbus協議概述協議架構與通信模式Modbus數據模型Modbus協議幀格式功能碼詳解Go Modbus庫完整實現高級應用示例調試與故障排除 Modbus協議概述 Modbus是一種串行通信協議&#xff0c;由Modicon公司&#xff08;現施耐德電氣&#xff09;于1979年開發&#xff0c;用于PL…