這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
& 位元運算 AND| 位元運算 OR^ 位元運算 XOR&^ 位清空 (AND NOT)<< 左移>> 右移
感覺位元運算操作符雖然在平時用得並不多,但是在涉及到底層效能最佳化或者使用某些trick的時候還是比較有意思。
&(AND) |(OR) 就不提了最常用的東西 會編程就會。
&操作的話是當 兩個數需要同時為1的時候才會保留。 例如 0000 0100 & 0000 1111 => 0000 0100 => 4
| 操作的話是當 兩個數同時為1或者1個為1一個不為1的時候會保留。 例如 0000 0100 | 0000 1111 => 0000 1111 => 15
^(XOR) 在go語言中XOR是作為二元運算子存在的:
但是如果是作為一元運算子出現,他的意思是按位取反,例如
package mainimport "fmt"func main() { x := 4 fmt.Println(^x)}output: -5
如果作為二元運算子則是
package mainimport "fmt"func main() { x := 4 y := 2 fmt.Println(x^y)}output: 6
XOR是不進位加法計算,也就是異或計算。0000 0100 + 0000 0010 = 0000 0110 = 6
&^ (AND NOT)位清空運算和被運算變數位置有關係,先看一個例子:
package mainimport "fmt"func main() { x := 2 y := 4 fmt.Println(x&^y)}output: 2
x&^y==x&(^y) 首先我們先換算成2進位 0000 0010 &^ 0000 0100 = 0000 0010 如果ybit位上的數是0則取x上對應位置的值, 如果ybit位上為1則結果位上取0
>>右移 <<左移 感覺右移左移應該也是非常常見的使用了 繼續看例子:
package mainimport "fmt"func main() { x := 2 y := 4 fmt.Println(x<<1) fmt.Println(y>>1)}output:4 2
進行轉化為二進位 然後向左或者向右移動。