關於位運算的一些小代碼

/*關於位運算的一些小代碼*/ package main import "fmt" // swap 不用任何額外變量, // 使用異或運算交換兩個整數的值 func swap(a, b *int) { *a = *a ^ *b *b = *a ^ *b *a = *a ^ *b } // max 不用任何比較判斷找出兩個數中較大的數 func max(a, b int32) int32 { flip := func(n int32) int32 { return n ^ 1 } sign := func(n int32) int32 { return flip((n >> 31) & 1) } c := a - b aSign, bSign, cSign := sign(a), sign(b), sign(c) abSignDif := aSign ^ bSign abSignSame := flip(abSignDif) returnA := abSignDif*aSign + abSignSame*cSign returnB := flip(returnA) return a*returnA + b*returnB } // 整數的二進制表達中有多少個1 func countOne(n int) int { result := 0 for n != 0 { n -= n & (^n + 1) result++ } return result } // 整數的二進制表達中有多少個1(magic) func countOne2(n int) int { n = (n & 0x55555555) + ((n >> 1) & 0x55555555) n = (n & 0x33333333) + ((n >> 2) & 0x33333333) n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f) n = (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff) return (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff) } // // 整數的二進制表達中有多少個1(MIT hackmen) func countOne3(n int) int { t := n - ((n >> 1) & 0b11011011011011011011011011011011) - ((n >> 2) & 0b1001001001001001001001001001001) return ((t + (t >> 3)) & 0b11000111000111000111000111000111) % 63 } // 找到唯一出現奇數次的數 func findOdd(nums []int) int { result := 0 for _, v := range nums { result ^= v } return result } func main() { a, b := 1, 2 swap(&a, &b) fmt.Println(a, b) var c, d int32 = 123, 456 fmt.Println(max(c, d)) fmt.Println(countOne(1023), countOne(1024)) fmt.Println(countOne2(1023), countOne2(1024)) fmt.Println(countOne3(1023), countOne3(1024)) fmt.Println(findOdd([]int{1, 1, 2, 2, 3, 4, 4, 5, 5, 5, 5})) }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章