我試圖在某個位置修改位,但遇到了問題。例如我有1000000001,我該如何修改它0000000001?
uj5u.com熱心網友回復:
您可以應用位掩碼以僅保留您感興趣的位。
在這種情況下,如果您只想要最后一位,則應用位掩碼0b0000000001
https://go.dev/play/p/RNQEcON7sw1
// 'x' is your value
x := 0b1000000001
// Make the bitmask
mask := 0b0000000001
// Apply the bitmask with bitwise AND
output := x&mask
fmt.Println("This value == 1: ", output)
解釋
&是“AND”的位運算子。這意味著它逐位遍歷這兩個值,并將結果位設定為1當且僅當兩個輸入位都是1. 我在下面為 AND 運算子提供了一個真值表。
----------- ---------- --------------
| Input Bit | Mask Bit | Input & Mask |
----------- ---------- --------------
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
----------- ---------- --------------
因為我的掩碼函式1在最后一個位置只有a,所以只保留原始輸入的最后一個位置。所有前面的位將始終為0.
uj5u.com熱心網友回復:
- 構建一個面具,在您想要操作的每個地方都有一個面具
- 使用按位或設定位。
- 使用按位 AND 和反向掩碼來清除位。
- 使用 XOR 切換位
package main
import "fmt"
func main() {
k := 3 // manipulate the 3rd bit ...
mask := uint8(1) << (k - 1) // ... using 0b00000100 as a mask
var n uint8 = 0b10101010
fmt.Printf("0bb\n", n) // 0b10101010
// set kth bit
n |= mask
fmt.Printf("0bb\n", n) // 0b10101110
// clear kth bit
n &^= mask // &^ is Go's AND NOT operator
fmt.Printf("0bb\n", n) // 0b10101010
// toggle kth bit
n ^= mask
fmt.Printf("0bb\n", n) // 0b10101110
}
uj5u.com熱心網友回復:
func test() {
i := 1 << 9 //1000000000
i = i | (1 << 8) //1000000000 | 0100000000 == 1100000000
i = i | (1 << 7) //1100000000 | 0010000000 == 1110000000
i = i | (1 << 0) //1110000000 | 0000000001 == 1110000001
fmt.Printf("BEFORE: 0b\n", i) // 1110000001
i = i & ((1 << 9) - 1) // 1110000001 & ((1000000000) - 1) == 1110000001 & (0111111111) == 0110000001
fmt.Printf("AFTER: 0b\n", i) // 0110000001
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/429840.html
標籤:走
上一篇:在Go的后臺繼續運行第二個函式
下一篇:并發執行但序列化輸出
