算法 按位運算

按位與(Bitwise AND)和按位異或(Bitwise XOR)

按位與(&)

按位與是對兩個數的二進制表示的每一位進行邏輯與操作。

規則:兩個對應位都為1時,結果位才為1,否則為0。

示例:

5 & 35 的二進制:0101
3 的二進制:0011
-----------
按位與:0001 (即1)

按位異或(^)

按位異或是對兩個數的二進制表示的每一位進行邏輯異或操作。

規則:兩個對應位不同時,結果位為1,相同時為0。

示例:

5 ^ 35 的二進制:0101
3 的二進制:0011
-----------
按位異或:0110 (即6)

特性

按位與特性:

  • x & 0 = 0
  • x & x = x
  • x & ~x = 0
  • 可用于檢查奇偶性:x & 1(結果為1則是奇數,0則是偶數)

按位異或特性:

  • x ^ 0 = x
  • x ^ x = 0
  • x ^ y = y ^ x(交換律)
  • (x ^ y) ^ z = x ^ (y ^ z)(結合律)
  • 可用于交換兩個變量的值(不使用臨時變量):
    a ^= b;
    b ^= a;
    a ^= b;
    

應用場景

按位與常見用途:

  1. 掩碼操作(提取特定位)
  2. 判斷奇偶性
  3. 權限系統中檢查權限

按位異或常見用途:

  1. 交換兩個變量的值
  2. 加密算法
  3. 查找唯一出現一次的數字(其他數字都出現兩次)
  4. 圖形學中的顏色混合

這兩種位操作在底層編程、算法優化和嵌入式系統中經常使用。

完整的按位運算

除了按位與(AND)和按位異或(XOR)外,還有以下幾種常見的按位運算:

1. 按位或(Bitwise OR) |

對兩個數的二進制表示的每一位進行邏輯或操作。

規則:兩個對應位中只要有一個為1,結果位就為1。

示例:

5 | 35 的二進制:0101
3 的二進制:0011
-----------
按位或:0111 (即7)

特性

  • x | 0 = x
  • x | x = x
  • x | ~x = ~0(全1)
  • 常用于設置特定位為1

2. 按位非(Bitwise NOT) ~

對一個數的二進制表示的每一位進行取反操作(一元運算符)。

規則:0變1,1變0。

示例:

~55 的二進制:0101
-----------
按位非:1010 (在4位表示中為-6,具體取決于數據類型長度)

注意:結果取決于數值的位數和表示方式(補碼表示法)。

3. 左移(Left Shift) <<

將二進制數向左移動指定位數,右側補0。

效果:相當于乘以2的n次方(無溢出時)。

示例:

5 << 25 的二進制:0101
左移2位:010100 (即20)

4. 右移(Right Shift) >>

將二進制數向右移動指定位數,左側補符號位(算術右移)或補0(邏輯右移,取決于語言)。

效果:相當于除以2的n次方(向下取整)。

示例:

5 >> 15 的二進制:0101
右移1位:0010 (即2)

5. 無符號右移(Zero-fill Right Shift) >>>(某些語言如Java、JavaScript)

將二進制數向右移動指定位數,左側總是補0。

示例:

-5 >>> 1 (在32位系統中)-5 的二進制:11111111111111111111111111111011
無符號右移1位:01111111111111111111111111111101 (一個大正數)

復合賦值運算符

所有位運算符都有對應的復合賦值形式:

  • &= (按位與賦值)
  • |= (按位或賦值)
  • ^= (按位異或賦值)
  • <<= (左移賦值)
  • >>= (右移賦值)
  • >>>= (無符號右移賦值)

應用總結

運算符名稱用途示例
&按位與掩碼操作、權限檢查
l按位或設置特定位
^按位異或交換值、加密、找唯一數
~按位非取反操作
<<左移快速乘以2的冪
>>右移快速除以2的冪(算術右移)
>>>無符號右移處理無符號數的右移(邏輯右移)

這些位運算在底層編程、算法優化、嵌入式系統開發、圖形處理和加密算法中都有廣泛應用。

Java 實現:查找唯一出現一次的數字(其他數字都出現兩次)

方法思路
  1. 異或運算特性

    • 任何數和 0 異或等于它本身:x ^ 0 = x 0 在異或運算中相當于“無影響”
    • 任何數和自身異或等于 0x ^ x = 0
    • 異或運算滿足交換律和結合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
  2. 算法步驟

    • 初始化 result = 0
    • 遍歷數組,對每個元素執行 result ^= num
    • 最終 result 就是唯一出現一次的數字。
代碼實現
public class SingleNumber {public static int singleNumber(int[] nums) {int result = 0; // 初始時 result=0,不影響第一次運算for (int num : nums) {result ^= num;}return result;}public static void main(String[] args) {int[] nums = {4, 1, 2, 1, 2};System.out.println("唯一出現一次的數字是: " + singleNumber(nums)); // 輸出: 4}
}
代碼解釋
  1. 方法 singleNumber

    • 初始化 result0
    • 使用增強 for 循環遍歷數組 nums,對每個元素 num 執行異或操作 result ^= num
    • 最終返回 result,即唯一出現一次的數字。
  2. 主方法 main

    • 定義一個測試數組 nums,其中 4 是唯一出現一次的數字。
    • 調用 singleNumber 方法并打印結果。
復雜度分析
  • 時間復雜度O(n),只需遍歷數組一次。
  • 空間復雜度O(1),僅使用常數空間存儲 result
示例運行

輸入:[4, 1, 2, 1, 2]
輸出:唯一出現一次的數字是: 4

進階問題

如果數組中有兩個數字只出現一次,其他數字都出現兩次,如何找出這兩個數字?
提示

  1. 先異或所有數字得到 xorSum
  2. 找到 xorSum 的任意一個為 1 的位(如最低位的 1)。
  3. 根據該位將數組分成兩組,分別異或得到兩個唯一數字。

Java 實現示例

public static int[] findTwoSingleNumbers(int[] nums) {int xorSum = 0;for (int num : nums) {xorSum ^= num;}int diffBit = xorSum & -xorSum; // 找到最右邊的不同位int[] result = new int[2];for (int num : nums) {if ((num & diffBit) == 0) {result[0] ^= num;} else {result[1] ^= num;}}return result;
}

二進制數1

牛客網 : 二進制數1

在這里插入圖片描述

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main{public static void main(String[] args) throws IOException {BufferedReader br=new BufferedReader(new InputStreamReader(System.in));long lnum=Long.parseLong(br.readLine());br.close();System.out.println(Long.bitCount(lnum));}
}

二進制不同位數

牛客網 : 二進制不同位數

在這里插入圖片描述

import java.io.*;
import java.util.*;public class Main {public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String s = null;while ((s = reader.readLine()) != null) {String[] cs = s.split(" ");//int n = Integer.parseInt(s);//異或,相同是0,不同是1,先異或,再統計1的個數int a = Integer.parseInt(cs[0]);int b = Integer.parseInt(cs[1]);int c = a ^ b;int res=0;while (c!=0){res+=c&1;c=c>>>1;}System.out.println(res);}}}

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

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

相關文章

python3GUI--基于PyQt5+SQLite3的網址審核系統(詳細圖文)

文章目錄 一&#xff0e;前言二&#xff0e;相關知識1.PyQt52.sqlite3 三&#xff0e;效果預覽1.登錄2.注冊3.普通用戶身份權限4.管理員身份權限 三、技術討論1.數據展示表格1. 更強的表現力和交互性&#xff08;前端功能豐富&#xff09;2. 數據處理效率更高&#xff08;支持大…

與后端現場聯調mock數據

當我們后端在現場沒辦法連后端本地就可以使用mock數據&#xff0c;模擬后端返回數據。使用工具&#xff1a;apifox 一、安裝好以后--新建接口 舉個栗子&#xff1a; 我想建個接口http://123.123.123.123:8080/api/login 二、 新建期望&#xff0c;返回固定值&#xff0c;否則…

C# 事件(發布者和訂閱者)

發布者和訂閱者 很多程序都有一個共同的需求&#xff0c;即當一個特定的程序事件發生時&#xff0c;程序的其他部分可以得到 該事件已經發生的通知。 發布者/訂閱者模式&#xff08;publisher/subscriber pattem&#xff09;可以滿足這種需求。在這種模式中&#xff0c;發布 …

RediSearch高性能全文搜索引擎

RediSearch 是 RedisLabs 團隊開發的一個高性能全文搜索引擎&#xff0c;可作為一個 Redis Module 運行在 Redis 上。 Redis7&#xff1a;百萬數據級Redis Search 超越 ElasticSearch Redis Search是基于Redis的全文搜索引擎模塊&#xff08;RediSearch&#xff09;&#xff0c…

菜譜大全——字符串處理藝術:從文本解析到高效搜索 [特殊字符][特殊字符]

目錄 前言一、現實場景二、技術映射2.1 基礎刀工&#xff1a;String類2.2 高效剁餡&#xff1a;StringBuilder2.3 精準雕刻&#xff1a;正則表達式 三、知識點呈現3.1 String vs StringBuilder vs StringBuffer3.2 正則表達式核心語法速查3.3 字符串拼接性能陷阱 四、代碼實現五…

webpack+vite前端構建工具 -答疑

webpack答疑 1 輸入webpack命令&#xff0c;執行的是全局版本還是本地版本的webpack 當在命令行窗口輸入webpack命令時&#xff0c;其執行優先級可通過以下步驟明確判斷&#xff1a; 1.1 【全局安裝優先機制】 執行原理&#xff1a;系統會按照環境變量PATH的順序逐級查找可執…

API接口開放平臺 Crabc 3.4 發布

Crabc 是一款 API 接口開發平臺&#xff0c;企業級接口管理、SQL2API 平臺。支持動態數據源、動態 SQL 和標簽&#xff0c; 支持接入&#xff08;mysql、oracle、達夢、TiDB、hive、es 和 mongodb&#xff09;等 SQL 或 NoSQL 數據源&#xff0c;在線可視化編寫 SQL 快速發布接…

PD快充協議芯片XSP04D支持全協議+支持串口通訊+支持與主板共用一個Type-C

隨著Type-C接口的充電器普及&#xff0c;市面上的PD充電器越來越多&#xff0c;小家電產品可不配充電器&#xff0c;使用Type-C接口&#xff0c;然后加入一顆PD協議取電協議芯片XSP08即可讓充電器/充電寶/車充等電源輸出9V/12V/15V/20V電壓給產品供電。 針對各種各樣的不同需求…

C# 高效加載txt文件內容

在 C# 中&#xff0c;高效加載 TXT 文件內容可以通過多種方法實現&#xff0c;具體方法的選擇取決于文件的大小和讀取需求。以下是一些常用的方法&#xff1a; 1. 使用 File.ReadAllText 如果文件比較小&#xff0c;并且你希望一行一行地讀取整個內容&#xff0c;可以使用 Fi…

(2)pytest執行用例的規則

1. 簡介 今天主要學習一下pytest的執行用例的規則。 2. 通過help幫助查看pytest如何使用 .查看pytest命令行參數&#xff0c;可以用pytest -h 或pytest --help查看 3. 用例設計原則 文件名以test_*.py文件和*_test.py以test_開頭的函數以Test開頭的類以test_開頭的方法所有的…

InnoDB數據頁

導讀&#xff1a; 我們已經知道了頁是數據庫存儲的基本單位&#xff0c;知道了一條行記錄的存儲格式是怎樣的&#xff0c;當數據越來越多時&#xff0c;那一條條行記錄具體又是怎么在頁中被組織起來的呢&#xff1f; 一、InnoDB數據頁結構 二、總結 1、一條條行數據是如何在數…

世賽背景下,中職物聯網應用與服務賽項實訓解決方案

一、世賽背景與物聯網應用賽項概述 1.1 世賽發展歷程及對中職教育的影響 世界技能大賽&#xff08;WorldSkills Competition&#xff0c;簡稱世賽&#xff09;自1950年創立以來&#xff0c;已經成為全球范圍內展示職業技能水平的重要賽事。截至2024年&#xff0c;世賽已成功舉…

【攻防篇】解決:阿里云docker 容器中自動啟動xmrig挖礦-- 實戰

文章目錄 場景一、問題二、原因三、解決方案1、控制臺處理2、 [清除與防護](https://blog.csdn.net/ladymorgana/article/details/148921668?spm1001.2014.3001.5501)1. 緊急處理&#xff1a;停止挖礦進程2. 清理被感染的容器3. 防護措施&#xff1a;防止再次被入侵4. 排查入侵…

飛算智造JavaAI:智能編程革命——AI重構Java開發新范式

文章目錄 引言&#xff1a;當傳統Java開發遇上AI一、技術架構解析1.1 核心架構圖1.2 關鍵技術棧 二、實戰演示&#xff1a;從需求到代碼的全AI輔助2.1 場景&#xff1a;電商優惠券系統開發2.2 代碼生成實例2.3 智能調試演示 三、與傳統開發模式對比測試3.1 基準測試數據3.2 典型…

[特殊字符] 分享裂變新姿勢:用 UniApp + Vue3 玩轉小程序頁面分享跳轉!

在如今流量成本日益攀升的移動互聯網時代&#xff0c;"用戶分享拉新" 成為了增長的重要策略。而微信小程序作為天然具備社交傳播力的平臺&#xff0c;提供了較完善的分享機制支持。本文將從實戰角度出發&#xff0c;手把手教你如何使用 uni-app Vue3 構建一個支持「…

[創業之路-458]:企業經營層 - 藍海戰略 - 重構價值曲線、整合產業要素、創造新需求

“重構價值曲線、整合產業要素、創造新需求”是藍海戰略中實現價值創新的核心路徑&#xff0c;它們構成了一個從內部優化到外部協同&#xff0c;再到市場顛覆的完整邏輯鏈條。以下從理論框架、實踐方法和企業案例三個維度展開分析&#xff1a; 一、重構價值曲線&#xff1a;打…

慢查詢引發對mysql索引的探索

目錄 一、索引分類 1.1 聚簇索引結構 1.2 非聚簇索引(二級索引) 1.3 主鍵索引 1.4 唯一索引 1.5 普通索引 1.6 前綴索引 1.7 聯合索引 1.8 索引下推 1.9 索引區分度 二、優化索引的方法 2.1 索引的特點 2.2 適合創建索引的情況 2.3 不適合創建索引的情況 2.4 優…

啟用不安全的HTTP方法

背景&#xff1a; 今天被安全檢測出一個這樣的問題&#xff1a;啟用不安全的HTTP方法。DELETE方法是用來調試web服務器連接的http方式&#xff0c;支持該方式的服務器文件可能被非法刪除&#xff1b;PUT方法用來向服務器提交文件&#xff1b;TRACE方法本用于客戶端測試到服務器…

fvcom 水深文件dep制作

fvcom 水深文件dep制作 fvcom 水深文件dep制作20250630 本次案例網格和水深展示 vv image Figure 1 Model domain 本次制作其它驅動文件的輸入文件為yellowsea.2dm 格式2dm; 文件內容格式詳細介紹參考&#xff1a; https://www.xmswiki.com/wiki/SMS:2D_Mesh_Files_*.2dm …

ViewModel是EventFlow-State映射

ViewModel負責組裝界面狀態State。引發State變換的原因有很多&#xff0c;比如用戶點擊某個按鈕&#xff0c;一次網絡請求受到應答&#xff0c;一次本地數據庫查詢返回結果等等。因此ViewModel是根據各種事件生成State的對象&#xff0c;換句話說&#xff0c;是一個從多個事件流…