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

  • 相关阅读:
    现代软件工程 第一章 概论 第4题——邓琨
    现代软件工程 第一章 概论 第9题——邓琨
    现代软件工程 第一章 概论 第7题——张星星
    现代软件工程 第一章 概论 第5题——韩婧
    hdu 5821 Ball 贪心(多校)
    hdu 1074 Doing Homework 状压dp
    hdu 1074 Doing Homework 状压dp
    hdu 1069 Monkey and Banana LIS变形
    最长上升子序列的初步学习
    hdu 1024 Max Sum Plus Plus(m段最大子列和)
  • 原文地址:https://www.cnblogs.com/javaXRG/p/11135953.html
Copyright © 2011-2022 走看看