• 【Java基础】位运算符与原码,补码,反码


    目录

    计算机进制基础

    位运算符

    原码,补码和反码


    计算机进制基础

    计算机汇编语言中,计算进制分为四种:二进制,八进制,十进制和十六进制

    二进制 B (binary)

    逢二进一,基数为2,数值部分用两个不同的数字0、1来表示。

    示例:7 = 0b0111,0b表示二进制
    八进制 O (octal)

    逢八进一,基数为8,数值部分分别用0,1,2,3,4,5,6,7来表示。

    示例:10=012,第一位补0表示八进制
    十进制 D (decimal)

    逢十进一,基数为10,数值部分分别用0,1,2,3,4,5,6,7,8,9来表示。

    示例:11=11,我们数学运算中最常用的进制
    十六进制 H (hexadecimal)

    逢十六进一,基数为16,数值部分用十进制表示0~9,用子没有A,B,C,D,E,F表示10~15。

    示例:30=0X1E,0X前缀表示十六进制

    小技巧

    Windows系统打开计算器(win+r输入calc),选择程序员

    输入一个数字得出不同进制的计算结果

    位运算符

    Java位运算符分为两类:位逻辑运算和移位运算

    位逻辑运算符(4个):

    1. 按位与(&)
    2. 按位或(|)
    3. 按位取反(~)
    4. 按位异或(^)

    移位运算符(3个):

    1. 左移(<<)
    2. 右移(>>)
    3. 无符号右移(>>>)
    运算符描述
    &两位都为1,结果为1,否则为0
    |两位都为0,结果为0,否则为1
    ~两位一个为0,一个为1,结果为1,否则为0
    ^数字反转,0变成1,1变成0
    <<低位溢出,符号位不变,并用符号位补溢出的高位
    >>符号位不变,低位补0
    >>>低位溢出,高位补0

    原码,补码和反码

    机器数:一个数在计算机的存储形式是二进制数,我们称这些二进制数为机器数,机器数是有符号,在计算机中用机器数的最高位存放符号位,0表示正数,1表示负数。

    原码

    原码表示的数值与机器数一样,即原码就是计算机的二进制数

    +1 = 0000 0001   最高位的0表示正数

    -1  = 1000 0001  最高位的1表示负数

    反码

    反码的表示方式分为以下两种:

    • 正数的补码=原码
    • 负数的补码=最高位符号位不变,其他位取反

    +1的反码 = +1的原码 = 0000 0001

    -1的反码 = 1111 1110

    补码

    补码的表示方式分为以下两种:

    • 正数的补码=原码
    • 负数的补码=负数的反码+1

    +1的补码 = +1的原码 = 0000 0001

    -1的补码 = -1的反码 + 1 = 1111 1110 + 1 = 1111 1111

    总结以下:

    1. 二进制的最高位是符号位,0表示正数,1表示负数
    2. 正数的原码=反码=补码
    3. 负数的反码=原码符号位不变,其他位取反
    4. 负数的补码=负数的反码+1,反之,负数的反码=负数的补码-1
    5. 0的反码和补码都是0
    6. 计算机内存中做运算时都是通过补码进行运算的,得出的结果再转成原码才是我们前台输出的结果

    关于上面的几点,我们通过位逻辑运算符做一些简单例子演示

    求出2 & 3的结果

    1. 求出2的原码:原码 = 0000 0010
    2. 上述规则2可得出,2的补码 = 2的原码 = 0000 0010
    3. 求出3的原码:原码 = 0000 0011
    4. 上述规则2可得出,3的补码 = 3的原码 = 0000 0011
    5. 根据规则6,计算机中做运算都是通过补码来进行运算的,即:
    6. 2 & 3 = 2的补码 & 3的补码 =0000 0010 & 0000 0011 = 0000 0010
    7. 0000 0010是我们计算后的补码结果,根据规则1和2得出原码也是相同的,再将我们的原码转成十进制得出的结果为2

    求出~-2的结果

    1. 求出-2的原码:原码 = 1000 0010
    2. 根据规则3计算出反码,-2的反码 = 1111 1101
    3. 根据规则4计算出补码,-2的补码= -2的反码+1 = 1111 1101 + 0000 0001 = 1111 1110
    4. 根据规则6对计算出的补码进行运算,~1111 1110 = 0000 0001
    5. 0000 0001是我们计算后的补码结果,根据规则1和2得出原码也是相同的,再将我们的原码转成十进制得出的结果为1

    最后给个练习题:计算~2的结果?

  • 相关阅读:
    Leetcode 828. 统计子串中的唯一字符
    【linux 0.11 学习记录】一、环境配置,用Bochs输出hello world
    软考 --- 数据库(2)关系模型
    留存计算方式
    【STM32教程】第五章 STM32的定时器
    JNI编程之字符串处理
    2023年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析
    说下 RESTful API 使用的几个方法
    python flask 和浏览器实现 websocket 双向通讯- flask-socketio
    技术需求创新手段组织方式 国稻种芯:转型促农业产业变革
  • 原文地址:https://blog.csdn.net/LeechengLove/article/details/125399131