算法 LC 顛倒二進(jìn)制位

顛倒給定的 32 位無符號整數(shù)的二進(jìn)制位。

示例 1:

輸入:n = 00000010100101000001111010011100
輸出:964176192 (00111001011110000010100101000000)
解釋:輸入的二進(jìn)制串 00000010100101000001111010011100 表示無符號整數(shù) 43261596,
因此返回 964176192,其二進(jìn)制表示形式為 00111001011110000010100101000000梯影。
示例 2:

輸入:n = 11111111111111111111111111111101
輸出:3221225471 (10111111111111111111111111111111)
解釋:輸入的二進(jìn)制串 11111111111111111111111111111101 表示無符號整數(shù) 4294967293,
因此返回 3221225471 其二進(jìn)制表示形式為 10111111111111111111111111111111 怕篷。

題解

思路1: 逐位顛倒

將n視作一個長為32的二進(jìn)制串,從低位往高位枚舉n的每一位钻洒,將其倒序添加到翻轉(zhuǎn)結(jié)果rev中。

顛倒二進(jìn)制锄开,即 原本的最低位素标,會到最高位
n對2取余,即可獲得最低位的數(shù)值
每次將最低位轉(zhuǎn)到最高位后萍悴,重新賦值n = n/2 直到n為0
由于是32位头遭,第一次取余后的值乘以2的31次方即到最高位 第二次是乘以2的30次方...

    static public func reverseBits1(_ n: Int) -> Int {
        var n = n
        var rev = 0
        var count = 0
        while n > 0 {
            let a = n%2
            rev += a * 1<<(31-count)
            n = n/2
            count += 1
        }
        return rev
        
    }

思路2:位運算分治
對于遞歸的最底層,我們需要交換所有奇偶位:

取出所有奇數(shù)位和偶數(shù)位癣诱;
將奇數(shù)位移到偶數(shù)位上计维,偶數(shù)位移到奇數(shù)位上。
類似地撕予,對于倒數(shù)第二層鲫惶,每兩位分一組,按組號取出所有奇數(shù)組和偶數(shù)組实抡,然后將奇數(shù)組移到偶數(shù)組上剑按,偶數(shù)組移到奇數(shù)組上。以此類推澜术。

    static public func reverseBits2(_ n: Int) -> Int {
        var n = n
        //交換左右兩邊16位數(shù)
        n = (n >> 16) | (n << 16)
        //交換左右兩邊8位數(shù)
        n = ((n & 0b1111_1111_0000_0000_1111_1111_0000_0000) >> 8)
          | ((n & 0b0000_0000_1111_1111_0000_0000_1111_1111) << 8)
        //交換左右兩邊4位數(shù)
        n = ((n & 0b1111_0000_1111_0000_1111_0000_1111_0000) >> 4)
          | ((n & 0b0000_1111_0000_1111_0000_1111_0000_1111) << 4)
        //交換左右兩邊2位數(shù)
        n = ((n & 0b1100_1100_1100_1100_1100_1100_1100_1100) >> 2)
          | ((n & 0b0011_0011_0011_0011_0011_0011_0011_0011) << 2)
        //交換左右兩邊1位數(shù)
        n = ((n & 0b1010_1010_1010_1010_1010_1010_1010_1010) >> 1)
          | ((n & 0b0101_0101_0101_0101_0101_0101_0101_0101) << 1)

        return n


    }
    static public func reverseBits3(_ n: Int) -> Int {
        var rev = n
        //低16位與高16位交換
        rev = (rev >> 16) | (rev << 16)

        //每16位中低8位和高8位交換; 1111是f (這里每一個十六進(jìn)制的數(shù)字都代表4位二進(jìn)制)
        // 右移8位得到高位的8位艺蝴,左移8位得到低位的8位
        rev = ((rev & 0xff00ff00) >> 8) | ((rev & 0x00ff00ff) << 8)

        //每8位中低4位和高4位交換;
        rev = ((rev & 0xf0f0f0f0) >> 4) | ((rev & 0x0f0f0f0f) << 4)

        //每4位中低2位和高2位交換; 1100是c, 0011是3
        rev = ((rev & 0xcccccccc) >> 2) | ((rev & 0x33333333) << 2)

        //每2位中低1位和高1位交換; 1010是a, 0101是5
        rev = ((rev & 0xaaaaaaaa) >> 1) | ((rev & 0x55555555) << 1)

        return rev



    }

參考:https://leetcode-cn.com/problems/reverse-bits/solution/dian-dao-er-jin-zhi-wei-by-leetcode-solu-yhxz/
https://leetcode-cn.com/problems/reverse-bits

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸟废,隨后出現(xiàn)的幾起案子猜敢,更是在濱河造成了極大的恐慌,老刑警劉巖盒延,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缩擂,死亡現(xiàn)場離奇詭異,居然都是意外死亡添寺,警方通過查閱死者的電腦和手機(jī)胯盯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來计露,“玉大人博脑,你說我怎么就攤上這事∑惫蓿” “怎么了叉趣?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長该押。 經(jīng)常有香客問我疗杉,道長,這世上最難降的妖魔是什么蚕礼? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任烟具,我火速辦了婚禮梢什,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朝聋。我一直安慰自己嗡午,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布玖翅。 她就那樣靜靜地躺著翼馆,像睡著了一般割以。 火紅的嫁衣襯著肌膚如雪金度。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天严沥,我揣著相機(jī)與錄音猜极,去河邊找鬼。 笑死消玄,一個胖子當(dāng)著我的面吹牛跟伏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翩瓜,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼受扳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了兔跌?” 一聲冷哼從身側(cè)響起勘高,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坟桅,沒想到半個月后华望,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡仅乓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年赖舟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夸楣。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宾抓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豫喧,到底是詐尸還是另有隱情洞慎,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布嘿棘,位于F島的核電站劲腿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鸟妙。R本人自食惡果不足惜焦人,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一挥吵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧花椭,春花似錦忽匈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袋倔,卻和暖如春雕蔽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宾娜。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工批狐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人前塔。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓嚣艇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親华弓。 傳聞我的和親對象是個殘疾皇子食零,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容