美文网首页
go语言操作符 ^ 和 &^

go语言操作符 ^ 和 &^

作者: 剥桔子 | 来源:发表于2020-10-20 00:45 被阅读0次

    很多语言都是采用 ~ 作为按位取反运算符,Go 里面采用的是 ^ 。

    如果作为二元运算符,^ 表示按位异或,即:对应位相同为 0,相异为 1。

    操作符 &^,按位置零,例如:z = x &^ y,表示如果 y 中的 bit 位为 1,则 z 对应 bit 位为 0,否则 z 对应 bit 位等于 x 中相应的 bit 位的值。

    正数的补码、反码都是其二进制本身,只是需要在首位填加0,作为符号位。

    负数的反码:符号位1不变,后面有效位数全部取反;

    负数的补码:其反码再加1得到,即原码通过符号位不变,且有效位按位取反再加1也可得到;

    对于有符号的整数来说,是按照补码进行取反操作的(快速计算方法:对数 a 取反,结果为 -(a+1) ),对于无符号整数来说就是按位取反


    计算过程


    以3为例  3在内存中补码为 0*** 0011

    取反            1*** 1100

    -1操作          1*** 1011

    除符号位取反    1*** 0100 结果为-4

    -------------------------------------------

    以9为例 9在内存中补码为 0*** 1001

    取反            1*** 0110

    -1操作          1*** 0101

    除符号位取反    1*** 1010 结果为-10

    -------------------------------------------

    以-5为例 -5在内存中为的补码为 1*** 1011

    为什么呢

    -5源码          1*** 0101

    除符号取反      1*** 1010

    +1操作          1*** 1011

    -------------------------------------------

    那么-5取反怎么算

    补码 1***1011取反为 0***0100

    因为符号位为0,所以是正数了,正数的补码反码源码都是一个,所以是4

    ===================================

    再看-1

    -1源码          1*** 0001

    除符号取反      1*** 1110

    +1操作          1*** 1111

    补码 1*** 1111 取反为 0*** 0000

    因为符号位为0,所以是正数了,正数的补码反码源码都是一个,所以是0


    go语言取反输出的例子看这里

    相关文章

      网友评论

          本文标题:go语言操作符 ^ 和 &^

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