zoukankan      html  css  js  c++  java
  • 位运算符,原码、反码、补码

    按位运算就把数字转换为机器语言->二进制的数字来运算的一种运算形式。

    & 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
    | 按位或运算符:参与运算的两个值,只要其中有一个为1,则该位结果就为1
    ^ 按位异或运算符:当两个对应的二进位相异时,结果为1
    ~ 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。将二进制数+1之后乘以-1,即~x=-(x+1)
    << 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0
    >> 右移动运算符:把">>"左边的运算数的各二进位全部右移动若干位,">>"右边的数指定移动的位数
    

    只有按位取反运算符是单目运算符,其他都是双目运算符。

    a = 60  # 0011 1100
    b = 13  # 0000 1101
    
    print(a&b)
    # 12
    print(a|b)
    # 61
    print(a^b)
    # 49
    
    # 按位取反,1100 0011
    print(~a)
    # -61
    
    # 向左移动两位,1111 0000
    print(a<<2)
    # 240
    
    # 向右移动两位,0000 1111
    print(a>>2)
    # 15
    

    计算机中的符号数有三种表示方法,三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”。
    在计算机系统中,数值一律用补码来表示和存储。

    原码: 正数转化为二进制,负数第一位取1。5=>0b101,1=>0b1,-1=>-0b1
    1:0000 0001
    -1:1000 0001
    反码: 正数的反码与原码相同,负数的反码符号位不变其余按位取反
    1:0000 0001
    -1:1111 1110
    补码:正数的补码与原码相同,负数的补码符号位不变其余按位取反后+1
    1:0000 0001
    -1:1111 1111
    
    负数的表示方法
    - 早期数字电路的CPU中的运算器实现了加法器,但是没有减法器,减法要转换成加法
    - 负数在计算机中使用补码存储,-1的补码为 1111 1111
    - 5-1 => 5+(-1)直觉上是0b101-0b1,其实计算机中是0b101+0b11111111,溢出位舍弃
    
    5+(-1)两个二进制数相加,逢2进1
    0000 0101
    1111 1111
    ---------
    0000 0100
    
    print(~12)
    # -13
    
    12:0000 1100
    取反:1111 0011
    
    # 反推
    1111 0010
    1000 1101
    
    print(10^9)
    # 3
    0000 1010
    0000 1001
    ---------
    0000 0011
    
    print(10^-9)
    # -3
    
    # -9的补码
    1000 1001
    1111 0111
    
    # 用-9的补码与10的补码进行抑或运算
    0000 1010
    1111 0111
    ---------
    1111 1101
    
    # 把得到的补码还原。反推,将上面的结果-1然后取反,符号位不变
    1111 1100
    1000 0011
    

    参考:
    http://www.runoob.com/python3/python3-basic-operators.html
    https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
    https://blog.csdn.net/wangfei8348/article/details/51744311

  • 相关阅读:
    长春区域赛总结
    HDU 4297 One and One Story (LCA>RMQ)
    SRM 578 div1
    开学,网赛,压力。。。
    HDU 4291 A Short problem
    最大密集子图(POJ 3155)
    ubuntu安装sunjdk1.6
    【转】容斥原理
    生成树计数问题(SPOJ 104 Highways)
    Tonelli–Shanks Algorithm 二次剩余系解法 (Ural 1132. Square Root)
  • 原文地址:https://www.cnblogs.com/keithtt/p/9393756.html
Copyright © 2011-2022 走看看