国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

異或運算在算法中的神奇應(yīng)用

這篇具有很好參考價值的文章主要介紹了異或運算在算法中的神奇應(yīng)用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 什么是異或

兩個二進(jìn)制數(shù)進(jìn)行異或運算時,每一位上的數(shù)相同則結(jié)果為0,不同則結(jié)果為1。

示例:6^7=?

轉(zhuǎn)化成二進(jìn)制:
6=110
7=111
6^7=110^111=001=1

簡單記:異或就是二進(jìn)制的無進(jìn)位相加。
還有個同或運算:相同為1,不同為0,和異或是反的。

2. 異或運算的特性

  1. 任何數(shù)與0異或,結(jié)果還是這個數(shù):0^n=n
  2. 任何數(shù)與自身異或,結(jié)果都是0:n^n=0
  3. 異或運算滿足交換律和結(jié)合律

這幾個特性按照無進(jìn)位相加的思路來理解,就很好想明白。

3. 異或運算的神奇應(yīng)用

3.1 兩數(shù)交換

兩個數(shù)經(jīng)過3次異或運算后,可以交換位置。這其實也是上面特性的一個應(yīng)用。

a=1; b=3;
a=a^b; // a與b異或后,賦值給a:a=1^3 b=3
b=a^b; // 賦值后的a與b再次異或后,賦值給b:a=1^3 b=1^3^3=1(此時a初始的值已經(jīng)賦給b了)
a=a^b; // 賦值后的a和b再次異或后,賦值給a:a=1^3^1=3 b=1(完成了交換)

以上交換的邏輯,只有在兩個數(shù)指向不同的內(nèi)存塊時,才有效。如果兩個數(shù),指向同一個內(nèi)存塊,實際上就是1個數(shù),此時異或后,會得到0。
算法題:https://leetcode.cn/problems/swap-numbers-lcci/description/

3.2 找到出現(xiàn)奇數(shù)次的那個數(shù)

有一組數(shù),只有一個數(shù)出現(xiàn)了奇數(shù)次,其他數(shù)都出現(xiàn)了偶數(shù)次,如何快速找到這個數(shù)?

只要將所有數(shù)都做異或運算,得到的結(jié)果就是那個數(shù)。這是 n^n=0 & 0^n=n 的一個應(yīng)用。

算法題:https://leetcode.cn/problems/single-number/description/

3.3 提取二進(jìn)制數(shù)最右側(cè)的1(與異或無關(guān))

給定一個二進(jìn)制的數(shù),找到最右側(cè)的1。例如,二進(jìn)制數(shù):11001000,最右側(cè)的1對應(yīng)的二進(jìn)制數(shù)為:00001000。

通過公式:n & (~n + 1) 即可得到結(jié)果。

以 11001000 為例:
00110111 // 對n取反:~n
00111000 // 取反后加1:~n + 1
00001000 // 和n進(jìn)行與運算:n & (~n + 1)

取反運算規(guī)則:將二進(jìn)制的每一位逆轉(zhuǎn),1變成0,0變成1
與運算規(guī)則:僅1&1=1,其他都為0。

應(yīng)用:找出一個二進(jìn)制數(shù)n中一共有多少個1

rightOne = n & (~n + 1) // 找出最右側(cè)的1
n ^= rightOne // n和rightOne異或后,再賦值給n,可以抹掉n最右側(cè)的1
循環(huán)以上兩步直到n=0,數(shù)出一共循環(huán)了多少次即可

算法題:https://leetcode.cn/problems/number-of-1-bits/description/

擴(kuò)展:通過公式 n & (n - 1) 可以抹掉最右側(cè)的1,也可以找出二進(jìn)制數(shù)中有多少個1。

以 11001000 為例:
11000111 // n - 1
11000000 // n & (n - 1)

3.4 找到出現(xiàn)奇數(shù)次的那2個數(shù)

有一組數(shù),大部分?jǐn)?shù)都出現(xiàn)了偶數(shù)次,只有2個不同的數(shù)出現(xiàn)了奇數(shù)次,如何快速找到這2個數(shù)?

思路:
假設(shè)這兩個數(shù)為a和b,將所有的數(shù)進(jìn)行異或運算,得到的結(jié)果一定是:eor=a^b
eor一定不等于0(因為a!=b),也就是說eor的二進(jìn)制數(shù)在某一位上一定是1,且這個1一定來源于a和b其中一個數(shù)(因為只有1^0=1)
假設(shè)eor在第8位是1,根據(jù)第8位是1將數(shù)組分成兩組,1組中數(shù)的第8位都是1,2組中數(shù)的第8位都是0,如果a在1組中,那么b一定在2組中
上面兩組數(shù)中,除了a和b以外,其他數(shù)一定出現(xiàn)偶數(shù)次。1組所有數(shù)全部異或一定等于a,同理2組異或等于b
那么,只要得到eor最右側(cè)的1對應(yīng)的數(shù)eor',再用eor'與最初的數(shù)組的每一個數(shù)進(jìn)行與運算,結(jié)果等于1(或等于1)的全部保留下來進(jìn)行異或運算,一定得到了a或b
再用eor異或上面的結(jié)果,就得到了另一個數(shù),這樣兩個數(shù)都找到了。

以 [4, 4, 5, 5, 6, 7] 為例(對應(yīng)的二進(jìn)制數(shù):[0100, 0100, 0101, 0101, 0110, 0111]):
eor= 4^4 ^ 5^5 ^ 6^7 = 6^7 = 0110^0111 = 0001 // 將所有的數(shù)異或
eor'= 0001 // 找到eor最右側(cè)的1對應(yīng)的數(shù)(通過第3.3小節(jié)的公式可以得到)
array1= [0100, 0100, 0110] // 分成2組數(shù),這一組和eor'進(jìn)行與運算后都等于0,其他的數(shù)和eor'進(jìn)行與運算后都不等于0
a= 0100 & 0100 & 0110 = 0110 = 6
b= a^eor = 0110 ^ 0001 = 0111 = 7

算法題:https://leetcode.cn/problems/single-number-iii/description/文章來源地址http://www.zghlxwxcb.cn/news/detail-844402.html

到了這里,關(guān)于異或運算在算法中的神奇應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 異或數(shù)列/位運算/數(shù)位/二進(jìn)制

    異或數(shù)列/位運算/數(shù)位/二進(jìn)制

    ? ?知識點很多,依次總結(jié): 位運算: 1.左移/右移 針對二進(jìn)制數(shù)位來說的 2.或操作|? ?與操作? ?異或操作^ 異或操作滿足結(jié)合律、交換律和1^x=~x(即x翻轉(zhuǎn))? ? 0^x=x的規(guī)律 3.求數(shù)的最高數(shù)位: 求得的length為0b100000...其中0的個數(shù)等于val化為二進(jìn)制后的數(shù)位值,例如bin(15)=0b1111,為

    2023年04月08日
    瀏覽(23)
  • 位運算(按位與、按位或、異或、取反)以及原碼、反碼、補碼

    位運算(按位與、按位或、異或、取反)以及原碼、反碼、補碼

    目錄 位運算 按位與運算符 [ ] 按位或運算符 [ | ] 異或運算符 [ ^ ] 取反運算符 [ ~ ] 移位操作 一些面試??嫉奈徊僮鬟\算 獲取二進(jìn)制中最右邊的1 計算機(jī)原碼、反碼、補碼 機(jī)器數(shù) “三碼”之間的轉(zhuǎn)換 計算機(jī)中為啥要用補碼呢? 真數(shù) 原碼 反碼 補碼 有了原碼為什么要使用反碼

    2024年02月02日
    瀏覽(17)
  • C語言:位運算符----與(&),或(|),非(~),異或(^),左移(<<)和右移(>>)

    C語言:位運算符----與(&),或(|),非(~),異或(^),左移(<<)和右移(>>)

    C語言 基礎(chǔ)開發(fā)----目錄 位運算符 就是按二進(jìn)制位進(jìn)行運算。 C語言中位運算符主要包括六種,具體如下: 與(),或(|),非(~),異或(^),左移()和右移() 位運算符 含義 說明 按位 與 有0為0,雙1為1: 11=1,10=0,01=0,00=0 只有兩者對應(yīng)位都為 1 ,結(jié)果對應(yīng)位才為 1 ,否則為 0 I 按

    2024年01月18日
    瀏覽(21)
  • C#的幾種位操作運算,與、或、非、異或、左移、右移

    C#的幾種位操作運算,與、或、非、異或、左移、右移

    C#的常見幾種位操作運算,與($)、或(|)、非(~)、異或(^)、左移()、右移() 位操作一般來說比加減乘除計算要快一些 與()操作符的位都為1時,才為1,其他都為0,因此與()操作符的結(jié)果范圍在[0, Math.Min(x,y)],x,y均為正整數(shù) 或(|)操作符的位都為0時,才為0,其他都為1,因此或(|)操作

    2024年02月16日
    瀏覽(13)
  • 位運算:按位與、按位或、按位異或、按位左移、按位右移

    位運算:按位與、按位或、按位異或、按位左移、按位右移

    目錄 一、基礎(chǔ)知識補充 ? ? (1)位運算 ? ? (2)二進(jìn)制的詳細(xì)操作 二、位運算 ? ? (1)按位與() ? ? (2)按位或(|) ? ? (3)按位異或(^) ? ? ? (4)按位左移() ? ? (5)按位右移() 三、位運算例題 ? ? 題目描述: ? ? 題解: 四、共勉 ? ? 位運算符要比一般

    2024年02月03日
    瀏覽(26)
  • 【動態(tài)規(guī)劃】【位運算】1787. 使所有區(qū)間的異或結(jié)果為零

    【動態(tài)規(guī)劃】【位運算】1787. 使所有區(qū)間的異或結(jié)果為零

    【數(shù)位dp】【動態(tài)規(guī)劃】【狀態(tài)壓縮】【推薦】1012. 至少有 1 位重復(fù)的數(shù)字 動態(tài)規(guī)劃匯總 位運算 給你一個整數(shù)數(shù)組 nums??? 和一個整數(shù) k????? 。區(qū)間 [left, right](left = right)的 異或結(jié)果 是對下標(biāo)位于 left 和 right(包括 left 和 right )之間所有元素進(jìn)行 XOR 運算的結(jié)果

    2024年03月17日
    瀏覽(27)
  • WAF攻防-權(quán)限控制&代碼免殺&異或運算&變量覆蓋&混淆加密&傳參

    webshell檢測平臺 https://scanner.baidu.com/#/pages/intro https://ti.aliyun.com/#/webshell 對比工具代碼-菜刀蟻劍冰蝎哥斯拉等 對比WAF規(guī)則-函數(shù)匹配工具指紋等 1.php 傳參帶入 ?a=ass x=cGhwaW5mbygpOw== 2.php 變量覆蓋 x=cGhwaW5mbygpOw== 3.php 加密變異 http://www.phpjm.net/ 4.php 異或運算 5.php 腳本生成器 Webshel

    2023年04月11日
    瀏覽(18)
  • 位運算在排序算法中的運用

    異或是如何實現(xiàn)值交換的 異或的性質(zhì) 滿足交換律和結(jié)合律 即 a b=b a a b c=a (b c) 且 a^a=0 0^a=a 找出唯一的出現(xiàn)奇數(shù)次的數(shù) 現(xiàn)有N個數(shù),除了唯一的一個數(shù)出現(xiàn)的次數(shù)是奇數(shù),其他的均是出現(xiàn)了偶數(shù)次的數(shù),現(xiàn)在請編程找出這個出現(xiàn)奇數(shù)次的數(shù) 找出數(shù)組中出現(xiàn)奇數(shù)次的兩個數(shù) N個

    2024年02月06日
    瀏覽(9)
  • 什么是預(yù)處理器指令,常用的預(yù)處理器指令有哪些?什么是運算符,C 語言中的運算符有哪些?

    預(yù)處理器指令是一種用于在源代碼編譯之前進(jìn)行預(yù)處理的特殊指令。它們通過在程序編譯之前對源代碼進(jìn)行處理,可以在編譯階段之前進(jìn)行一些文本替換、條件編譯等操作,從而對源代碼進(jìn)行一些宏定義、條件編譯等操作。 常用的預(yù)處理器指令有以下幾種: #define:用于定義

    2024年02月15日
    瀏覽(17)
  • 探究位運算:位操作在Java中的應(yīng)用示例

    位運算是計算機(jī)科學(xué)中的基本概念,它充分利用了二進(jìn)制表示的特性來進(jìn)行快速且高效的計算。本文將深入介紹位運算的基礎(chǔ)知識,以及在Java中如何應(yīng)用位操作來解決問題。 概念 :異或(XOR)是一種位運算,用于對二進(jìn)制數(shù)的對應(yīng)位進(jìn)行比較。在數(shù)字計算中,異或運算有一

    2024年02月11日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包