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

    同学面试时被问到一个问题:-1右移两位是几呢,然后在他思考期间,面试官露出了奇怪的表情……所以赶快复习一下机器码及移位的相关知识


    首先介绍一下概念与规则:

    1、一般书写表示的数叫做真值,真值在计算机中的表示方式叫做机器码。

    2、正整数用原码、反码、补码三种方式表示时完全一样,比如1(int型占4位)的原码、反码、补码都为00000000 00000000 00000000 00000001。

    3、负整数用原码、反码、补码表示时,符号为都为1,用二进制表示的数值位各不相同。原码符号位为1不变,数值位按位取反得到反码,反码符号位不变,最低位加1得到补码。例如-1的原码为10000000 00000000 00000000 00000001,反码为11111111 11111111 11111111 11111110,补码为11111111 11111111 11111111 11111111

    4、为什么机器码要用补码表示呢?  用补码表示可以将减法运算转化为加法运算,这样在计算机中运算时比较方便,不论数是正是负,机器总是做加法。如1-1在计算机中是00000000 00000000 00000000 00000001 + 11111111 11111111 11111111 11111111 = 00000000 00000000 00000000 00000000 = 0


    移位运算:

    "<<"左移:右边空出的位置补0,左移一位相当于乘以2。1左移一位即为00000000 00000000 00000000 00000001左移一位为00000000 00000000 00000000 00000010,为2。左移时符号位也会移动。例如1向左移动31位即00000000 00000000 00000000 00000001左移变为10000000 00000000 00000000 00000000,因此1左移31位变为int类型的最小值-2147483648。-1左移一位即11111111 11111111 11111111 11111111左移变为11111111 11111111 11111111 11111110,即为-2。

    ">>"右移:左边空出的位,如果是正数则补0,若为负数则补0或1,取决于所用的计算机系统,其值相当于除以2。1右移一位即00000000 00000000 00000000 00000001变为00000000 00000000 00000000 00000000,即为0。-1右移一位即11111111 11111111 11111111 11111111右移1位为11111111 11111111 11111111 11111111,即为-1。

    如果左移或右移的位数超过了该数值类型的最大位数怎么办呢?编译器会用左移或右移的位数去模类型的最大位数,然后按余数进行一位操作。即:

    1>>32表示为1>>(32-32) = 1>>0 = 1; 1>>33表示为1>>(33-32) = 1>> 1 = 00000000 00000000 00000000 00000001 >> 00000000 00000000 00000000 00000000=0

    -1<<32表示为1<<(32-32) = 1 << 0 = 1; 1<< 33表示为1<<(33-32) = 1<< 1 = 00000000 00000000 00000000 00000001<<00000000 00000000 00000000 00000010=2

  • 相关阅读:
    Spring Boot 详细简介
    Linux 安装 MySQL 8 数据库(图文详细教程)
    有了这个日期工具类,让日期转化不再烦恼
    Linux常用实用命令
    Java分割中英文,并且中文不能分割一半?
    Spring MVC或Spring Boot配置默认访问页面不生效?
    js如何判断当前页面是否处于激活状态
    博客园 & 陌上花开HIMMR | 脱单倒计时!只能帮你到这了
    博客园 & 陌上花开HIMMR | 距2020年脱单,只剩34天!
    博客园 & 陌上花开HIMMR | 脱单倒计时!刚过完10.24的你,还想一个人过11.11吗?
  • 原文地址:https://www.cnblogs.com/javaXRG/p/11135953.html
Copyright © 2011-2022 走看看