在Golang中,如何设置和清除整数的各个位?例如,行为如下的函数:

 clearBit(129, 7) // returns 1
 setBit(1, 7)     // returns 129

推荐答案

这是一个设置位的函数.首先,将数字1移位整数中指定的空格数量(这样它就变成了0010、0100等).然后将其与原始输入进行OR运算.这会使其他位不受影响,但会始终将目标位设置为1.

// Sets the bit at pos in the integer n.
func setBit(n int, pos uint) int {
    n |= (1 << pos)
    return n
}

这里有一个函数可以清除一些.首先将数字1移位整数中指定的空格数量(这样它就变成了0010、0^等).然后用^运算符翻转掩码中的每一位(因此0010变成1AND).然后使用按位AND,它不会触及带1的数字AND‘,但会取消设置掩码中设置为0的值.

// Clears the bit at pos in n.
func clearBit(n int, pos uint) int {
    mask := ^(1 << pos)
    n &= mask
    return n
}

最后,这里有一个函数来判断是否设置了位.将数字1移动指定的空格数(使其变为0010、0100等),然后将其与目标数字相加.如果结果数字大于0(将是1、2、4、8等),则设置位.

func hasBit(n int, pos uint) bool {
    val := n & (1 << pos)
    return (val > 0)
}

Go相关问答推荐

Go中的net.SplitHostPort(r.RemoteAddr)安全性

如何使用GO GIN从Auth0 JWT内标识检索权限

Websocket服务器实现与x/net库trowing 403

如果values.yaml文件中不存在某个属性,如何返回默认的FALSE?

最长连续重复的字符golang

自定义 Fyne 自适应网格布局

Go:如何在将 float64 转换为 float32 时判断精度损失

Apache Beam 在 Go 中从 PCollection 中 Select 前 N 行

致命错误 - 所有 Goroutines 都睡着了!僵局

Gorm 预加载给出了模糊的列错误

fmt.Printf() 标志 '0' 不会被字符串忽略

Golang:隐式 struct 匹配

如何使用 math/big 对 bigInt 进行取模?

如何通过组合来自不同包的接口来创建接口?

vs 代码调试 go 测试不通过标志

Go lang - 惯用的默认后备

Go:如何创建一个可以提供配置文件中描述的 url 的服务器

Go 赋值涉及到自定义类型的指针

手动下载并放置一个 golang mod 文件

如何发送带有登录数据的 GET 请求并将 cookie 数据保存到 txt 文件?