Bit manipulation is important to know when doing data compression, cryptography and optimization.

Bitwise operations include AND, NOT, OR, XOR and bit shifts.

Go supported bit operations include:

& AND

| OR

^ XOR

&^ AND NOT

<< left-shift

>> right-shift

Go does not have a dedicated NOT operator like C++ or Python. Instead we have to use the XOR operator to toggle the bits.

var n byte = 0x0F

fmt.Printf("%08b\n", n)

n = ^n

fmt.Printf("%08b\n", n)

This is the output:

00001111

11110000

Here are some common bit manipulation algorithms that can be done in Go

- Swapping integers using XOR since XOR will result in 1 only if both bits are the same.

func swap(a, b int) (int, int) {

a = a ^ b

b = b ^ a

a = a ^ b

return a, b

}

- Toggle bits using XOR

func flip(a int) int{

a ^= 0xFFFFFFFF

return a

}

- Find Odd/even using AND

func isEven(n int) bool{

if n&1 == 1 {

return false

}

return true

}

- Find if a number is power of 2

func isPowerofTwo(n int) bool{

if (n & (n-1) == 0){

return true

}

return false

}

- Left Shift to multiply by 2

func multiplyBy2(uint num) uint{

return num << 1

}

- Right Shift to divide by 2

func divideBy2(uint num) uint{

return num >> 1

}

- Add without using addition operator

func add(a, b int64) int64 {

for b != 0 {

// common bits of a and b go to carry

carry := a & b

// xor - sum bits where one is not set

a = a ^ b

// shift carry by 1

b = carry << 1

}

return a

}

Go has a built in package that has functions to manipulate bits