美文网首页工作生活
位运算符补充

位运算符补充

作者: 野狐先生 | 来源:发表于2019-07-02 19:10 被阅读0次

    位运算符

    按位取反:1变成0,0变成1

    按位与:每位都是1,结果才为1

    按位或:每位只要有一个是1,结果就是1

    异或:不同为1,相同为0

    清除标志位:右侧数字的位上为1,清0,否则不清零

    位左移:每左移一位扩大2倍

    位右移:每右移一位除以2

    func main() {
        a,b:=5,6                //101   110
        fmt.Println(^a)         //按位取反  -6
        fmt.Println(a&b)        //按位与   4
        fmt.Println(a|b)        //按位或   7
        fmt.Println(a^b)        //异或        3
        fmt.Println(a&^b)       //右侧1表示清零       清除标志位
        fmt.Println(a<<1)       //10  相当于乘以2
        fmt.Println(a>>1)       //2   相当于除以2
    } 
    

    思考:如下代码输出什么?

    //练习一
    const(
        num1 int=1<<(iota*10)
        num2
    )
    func main(){
        fmt.Println(num1)   //1
        fmt.Println(num2)   //1024
    }
    
    //练习二
    const(
        num1 int=10
        num2 ="tom"
        num3 int=1<<(iota*2)
    )
    func main(){
        fmt.Println(num1)       //10
        fmt.Println(num2)       //tom
        fmt.Println(num3)       //16
    }
    

    原码、反码、补码

    正数的原码,反码,补码都是一样的。

    负数的反码 = 原码的符号位不变,其他的位取反【最高位为符号位:正数为0,负数为1】

    负数的补码 = 反码 + 1

    5的原码=0101     反码=0101   补码=0101
    -5的原码1101     反码=1010   补码=1011
    
    [7]原码=0111     [7]反=0111   [7]补码=0111
    [-7]原码=1111     [-7]反=1000 [-7]补码=1001
    

    分析:为什么^5=-6

    第一步:将5转成原码  = 0101
    第二步:原码转成补码 =0101   (正数的原、反、补是一样的)
    第三步:取反:      =1010    (补码运算)
    第四步:将补码转成反码:1010-1=1001  (反码)
    第五步:将反码转成原码:1110 =-6
    

    为什么使用补码计算机

    1、 +0和-0表示方法一样

    2、 利用高位溢出,将减法运算变成加法运算(利用补码运算可以将符号位参与运算)

    相关文章

      网友评论

        本文标题:位运算符补充

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