經過leetcode學習位運算及其Go實現

問題描述

461. Hamming Distance
即求兩個正整數的二進制對應位數不一樣的個數算法

原理說明

從問題描述來看,最直觀的解決方法就是十進制數先轉成二進制,再比對相同位數是否相同,不一樣則計數器累加,最終計數器的值便是Hamming Distance優化

優化方案:先^運算,對運算結果的位數進行遍歷,1則計數器累計ui

基於這個思想,須要用到的有 異或運算位運算code

異或^ 和 異或非

異或運算法則:相同爲零,不一樣爲一。
異或非運算法則:相同爲一,不一樣爲零。
即:ip

輸入A: 1 0 1 0
輸入B: 1 1 0 0
異或運算結果: 0 1 1 0
異或非(同或)運算結果:1 0 0 1

左移<< 和 右移>>

左移leetcode

  • 右邊空出的位用0填補
  • 高位左移溢出則捨棄該高位

右移get

  • 左邊空出的位用0或者1填補。正數用0填補,負數用1填補
  • 低位右移溢出則捨棄該位

代碼實現

func hammingDistance(x int, y int) int {
    counter := 0
    tmp := x ^ y
    t := 1
    
    for i := uint(0); i < 32 && t > 0; i++ {
        t = tmp >> i
        counter += (tmp >> i) & 1
    }
    return counter
}

參考

  1. 百度百科 異或非
  2. 百度百科 位運算
相關文章
相關標籤/搜索