分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
&^ 这个运算符最早是没有的
测试代码:
```
package main
import "fmt"
const (
hasMonotonic = 1 << 63
nsecMask = 1<<30 - 1
nsecShift = 30
)
func main() {
sec := 1632376722
nsec := 2324512
ynsec := uint64(nsec)
ysec := uint64(sec) << nsecShift
wall := hasMonotonic | uint64(sec)<<nsecShift | uint64(nsec)
fmt.Printf("%b\n", ysec)
fmt.Printf("%b\n", ynsec)
D := int64(3600 * 10e9)
oldnsec := wall & nsecMask
fmt.Printf("%v\n", oldnsec)
newNsec := int32(oldnsec) + int32(D%10e9)
fmt.Printf("%v\n", newNsec)
fmt.Printf("wall :%b\n", wall)
fmt.Printf("nsecMask. :%b\n", nsecMask)
fmt.Printf("wall_move :%b\n", wall>>30<<30)
fmt.Printf("wall&^nsecMask:%b\n", wall&^nsecMask)
wall1 := wall&^nsecMask | uint64(nsec)
fmt.Printf("wall1:%b\n", wall1)
wall2 := wall>>30<<30 | uint64(nsec)
fmt.Printf("wall2:%b\n", wall2)
fmt.Printf("equal:%v\n", wall1 == wall2)
}
```
以上代码我是变通处理,因为wall1 := wall&^nsecMask | uint64(nsec) 中 nsecMask 二进制是全1的,我直接用位移运算>>30<<30代替了。计算结果也是一样的。
但是如果不是 比如 1000000011000000000,就没法处理了。有人知道怎么拆分用& | ^其他语言也有的位运算符来达到 &^一样的结果?
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信1601 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传