位运算符 &^ 能拆分其他位运算符表示吗?因为这个位运算符其他语言C还有rust都没有。

wandercn · 2021-09-23 13:44:10 · 1345 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-09-23 13:44:10 的主题,其中的信息可能已经有所发展或是发生改变。

&^ 这个运算符最早是没有的

测试代码:

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

1345 次点击  
加入收藏 微博
3 回复  |  直到 2021-09-28 20:52:22
czyt
czyt · #1 · 4年之前

这个操作叫做 bit clear ,搜了下,希望对你有所帮助。

1、Setting a bit. Use the bitwise OR operator ( | ) to set a bit. number |= 1 << x; That will set a bit x .

2、Clearing a bit. Use the bitwise AND operator ( & ) to clear a bit. number &= ~(1 << x); That will clear bit x . ...

3、Toggling a bit. The XOR operator ( ^ ) can be used to toggle a bit. number ^= 1 << x;

dagongrenzzZ
dagongrenzzZ · #2 · 4年之前
 a &^ b = a ^ (a & b)
wandercn
wandercn · #3 · 4年之前

@dagongrenzzZ 谢谢,可以了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传