golang 左右交换int类型的所有bit

TangYiMo · 2021-08-04 08:34:34 · 1069 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2021-08-04 08:34:34 的文章,其中的信息可能已经有所发展或是发生改变。

源码:

root@jack-VirtualBox:~/test/zz# cat main.go 
package main

import (
    "errors"
    "fmt"
    "reflect"
)

func reserveint1(d interface{}) interface{} {
    flagint := false
    h := 0
    dsd := reflect.ValueOf(d)

    switch reflect.TypeOf(d) {
    case reflect.TypeOf(int(0)):
        h = 8
        flagint = true
    case reflect.TypeOf(int8(0)):
        h = 8
        flagint = true
    case reflect.TypeOf(int16(0)):
        h = 16
        flagint = true
    case reflect.TypeOf(int32(0)):
        h = 32
        flagint = true
    case reflect.TypeOf(int64(0)):
        h = 64
        flagint = true
    case reflect.TypeOf(uint(0)):
        h = 8
    case reflect.TypeOf(uint8(0)):
        h = 8
    case reflect.TypeOf(uint16(0)):
        h = 16
    case reflect.TypeOf(uint32(0)):
        h = 32
    case reflect.TypeOf(uint64(0)):
        h = 64
    default:
        return errors.New("not int type")
    }

    if flagint {
        ds := dsd.Int()
        var dd int64
        for i := 0; ds != 0; i++ {
            if (ds & 0x01) != 0 {
                dd |= 1 << (h - 1 - i)
            }
            ds = ds >> 1
        }
        return dd
    } else {
        ds := dsd.Uint()
        var dd uint64
        for i := 0; ds != 0; i++ {
            if (ds & 0x01) != 0 {
                dd |= 1 << (h - i)
            }
            ds = ds >> 1
        }
        return dd
    }
}

func reserveint(d int64) int64 {
    var dd int64

    for i := 0; d != int64(0); i++ {
        if (d & 0x01) != int64(0) {
            dd |= 1 << (63 - i)
        }
        d = d >> 1
    }

    return dd
}

func main() {
    fmt.Println("实现位反转")
    d := int64(0xaa12)
    fmt.Printf("%064b\r\n", d)
    dd := reserveint(d)
    fmt.Printf("%064b\r\n", dd)

    fmt.Println("\r\n用反射实现位反转, 64 bit")
    dt := int64(0xaa12)
    fmt.Printf("dt is:%064b\r\n", dt)
    dy := reserveint1(dt)
    fmt.Printf("dy is:%064b\r\n", dy)

    fmt.Println("\r\n用反射实现位反转, 32 bit")
    dz := int32(0xaa12)
    fmt.Printf("dz is:%032b\r\n", dz)
    dx := reserveint1(dz)
    fmt.Printf("dx is:%032b\r\n", dx)

    fmt.Println("\r\n用反射实现位反转, 16 bit")
    dk := int16(0xa12)
    fmt.Printf("dk is:%016b\r\n", dk)
    dl := reserveint1(dk)
    fmt.Printf("dl is:%016b\r\n", dl)

    fmt.Println("\r\n用反射实现位反转, 8 bit")
    dm := int8(0x12)
    fmt.Printf("dm is:%08b\r\n", dm)
    dn := reserveint1(dm)
    fmt.Printf("dn is:%08b\r\n", dn)
}
root@jack-VirtualBox:~/test/zz#

执行:

root@jack-VirtualBox:~/test/zz# go run main.go 
实现位反转
0000000000000000000000000000000000000000000000001010101000010010
0100100001010101000000000000000000000000000000000000000000000000

用反射实现位反转, 64 bit
dt is:0000000000000000000000000000000000000000000000001010101000010010
dy is:0100100001010101000000000000000000000000000000000000000000000000

用反射实现位反转, 32 bit
dz is:00000000000000001010101000010010
dx is:01001000010101010000000000000000

用反射实现位反转, 16 bit
dk is:0000101000010010
dl is:0100100001010000

用反射实现位反转, 8 bit
dm is:00010010
dn is:01001000
root@jack-VirtualBox:~/test/zz#

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

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