美文网首页
golang位移运算

golang位移运算

作者: n_xy | 来源:发表于2021-03-29 14:09 被阅读0次

    之前是写java的,没有无符号有符号之分,最近刷题碰到了位运算的题,就想把这个搞清楚一点。

    整数类型

    类型 范围
    int8 -128到127
    uint8 0到255
    int16 -32768到32767
    uint16 0到65535
    int32 -2147483648到2147483647
    uint32 0到4294967295
    int64 -9223372036854775808到9223372036854775807
    uint64 0到18446744073709551615

    另外常用的int类型是有符号数,位长取决于你的电脑的位长,电脑是64位的int就是64位的。

    位移运算符

    左移 <<
    右移>>

    规则

    首先无符号数没啥好说的,不管左移还是右移都是补0

    有符号数,以int为例(64位)
    老样子,机器内存的是补码
    以7fffffffffffffffff为例

    a := 0x7fffffffffffffff
    fmt.Printf("%x",a)
    //out :7fffffffffffffff
    b=-0x7fffffffffffffff
    fmt.Printf("%x",b)
    //out:-7fffffffffffffff
    c := 0xffffffffffffffff
    fmt.Printf("%x",a)
    //err :超出范围
    
    a =a<<1
    fmt.Printf("%x",a)
    //out:-2
    
    a = a>>1
    //out -1
    a= a>>100
    //out -1
    

    从前三个输出看,没有办法直接给int赋最大值(16进制),全f的话会报错,也就是不能直接赋值符号位,
    但是第四个输出来看,这里的运算是逻辑位移,输出-2(ffffffffffffffe,找了半天也没找到怎样输出正儿八经的16进制数),也就是位移包括符号位.
    之后再右移多少位都是-1(ffffff...f),就是补码位移规则

    综上:

    1. int类型 赋值要标明符号
    2. 位移运算符号位参加,按照补码运算规则(左移补0,右移补符号位

    。。。。好乱

    相关文章

      网友评论

          本文标题:golang位移运算

          本文链接:https://www.haomeiwen.com/subject/wvhbhltx.html