如何在 Go 中修改位?

我试图在某个位置修改位,但遇到了问题。例如我有1000000001,我该如何修改它0000000001



慕神8447489
浏览 102回答 3
3回答

收到一只叮咚

您可以应用位掩码以仅保留您感兴趣的位。在这种情况下,如果您只想要最后一位,则应用位掩码0b0000000001https://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.

动漫人物

构建一个面具,在您想要操作的每个地方都有一个面具使用按位或设置位。使用按位 AND 和反向掩码来清除位。使用 XOR 切换位package mainimport "fmt"func main() {&nbsp; &nbsp; k := 3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // manipulate the 3rd bit ...&nbsp; &nbsp; mask := uint8(1) << (k - 1) // ... using 0b00000100 as a mask&nbsp; &nbsp; var n uint8 = 0b10101010&nbsp; &nbsp; fmt.Printf("0b%08b\n", n) // 0b10101010&nbsp; &nbsp; // set kth bit&nbsp; &nbsp; n |= mask&nbsp; &nbsp; fmt.Printf("0b%08b\n", n) // 0b10101110&nbsp; &nbsp; // clear kth bit&nbsp; &nbsp; n &^= mask&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &^ is Go's AND NOT operator&nbsp; &nbsp; fmt.Printf("0b%08b\n", n) // 0b10101010&nbsp; &nbsp; // toggle kth bit&nbsp; &nbsp; n ^= mask&nbsp; &nbsp; fmt.Printf("0b%08b\n", n) // 0b10101110}

catspeake

func test() {&nbsp; &nbsp; i := 1 << 9 //1000000000&nbsp; &nbsp; i = i | (1 << 8) //1000000000 | 0100000000 == 1100000000&nbsp; &nbsp; i = i | (1 << 7) //1100000000 | 0010000000 == 1110000000&nbsp; &nbsp; i = i | (1 << 0) //1110000000 | 0000000001 == 1110000001&nbsp; &nbsp; fmt.Printf("BEFORE: %010b\n", i) // 1110000001&nbsp; &nbsp; i = i & ((1 << 9) - 1) // 1110000001 & ((1000000000) - 1) == 1110000001 & (0111111111) == 0110000001&nbsp; &nbsp; fmt.Printf("AFTER: %010b\n", i) // 0110000001}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go