zoukankan      html  css  js  c++  java
  • 原码,反码,补码,移位

    https://www.cnblogs.com/btgyoyo/p/6371398.html

    复习下二进制的有关知识

    1.所有的数据都是以二进制的形式存储在硬盘上。对于一个字节的8位到底是什么类型 计算机是如何分辨的呢? 其实计算机并不负责判断数据类型,数据类型是程序告诉计算机该如何解释内存块.

    2.对于字符的存储,先将字符转化成其字符集的码点,(码点就是一个数字),然后把该数字转成2进制存储。所以我们只要记得数字的存储就ok了。字符的码点程序采用无符号处理,即没有符号位,数值型默认都是有符号位的。

    1个字节的最高位是符号位所以一个数字能够存储的范围是-128-127

    3.原码

    正数5: 0000 0101

    负数5: 1000 0101

    4.反码

    正数5: 0000 0101

    负数5: 1111 1010

    5.补码

    正数5: 0000 0101

    负数5: 1111 1011(-5在硬盘上的存储方式)

    1.可以看到正数的原码 与 其反码补码相同
    2.负数的原码最高位为1
    3.负数的反码: 符号位不变,其余各位按位取反
    4.负数的补码:在其反码的基础上+1
    5.负数是以其补码的方式存储在硬盘上的

     6.左移操作(<<)

    复制代码
    规则:
    右边空出的位用0填补
    高位左移溢出则舍弃该高位。
    计算机中常用补码表示数据:
    数据 127,补码和原码一样:0111 1111。

    左移一位: 1111 1110   -> 这个补码对应的原码为:1000 0010  对应十进制:-2
    左移二位: 1111 1100   -> 这个补码对应的原码为:1000 0100  对应十进制:-4
    左移三位: 1111 1000   -> 这个补码对应的原码为:1000 1000  对应十进制:-8
    左移四位: 1111 0000   -> 这个补码对应的原码为:1001 0000  对应十进制:-16
    左移五位: 1110 0000   -> 这个补码对应的原码为:1010 0000  对应十进制:-32
    左移六位: 1100 0000   -> 这个补码对应的原码为:1100 0000  对应十进制:-64
    左移七位: 1000 0000   -> 这个补码对应的原码为:1000 0000  对应十进制:-128
    左移八位: 0000 0000   -> 这个补码对应的原码为:0000 0000  对应十进制:0
     
     
    注:
    原码到补码的计算方式:取反+1,
    补码到原码的计算方式:-1再取反。
     
     
     
    数据-1,它的原码为1000 0001,补码为1111 1111
    左移一位: 1111 1110   -> 这个补码对应的原码为:1000 0010  对应十进制:-2
    左移二位: 1111 1100   -> 这个补码对应的原码为:1000 0100  对应十进制:-4
    左移三位: 1111 1000   -> 这个补码对应的原码为:1000 1000  对应十进制:-8
    左移四位: 1111 0000   -> 这个补码对应的原码为:1001 0000  对应十进制:-16
    左移五位: 1110 0000   -> 这个补码对应的原码为:1010 0000  对应十进制:-32
    左移六位: 1100 0000   -> 这个补码对应的原码为:1100 0000  对应十进制:-64
    左移七位: 1000 0000   -> 这个补码对应的原码为:1000 0000  对应十进制:-128
    左移八位: 0000 0000   -> 这个补码对应的原码为:0000 0000  对应十进制:0
     
    可以看出127和-1的结果完全一样。移位操作与正负数无关,它只是忠实的将所有位进行移动,补0,舍弃操作。
    复制代码

    7.右移操作( >>)

    复制代码
    规则:
    左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;
    低位右移溢出则舍弃该位。

    1、127的补码:0111 1111
    右移一位: 0011 1111 -> 原码同补码一样 对应十进制:63
    右移二位: 0001 1111 -> 原码同补码一样 对应十进制:31
    右移三位: 0000 1111 -> 原码同补码一样 对应十进制:15
    右移四位: 0000 0111 -> 原码同补码一样 对应十进制:7
    右移五位: 0000 0011 -> 原码同补码一样 对应十进制:3
    右移六位: 0000 0001 -> 原码同补码一样 对应十进制:1
    右移七位: 0000 0000 -> 原码同补码一样 对应十进制:0
    右移八位: 0000 0000 -> 原码同补码一样 对应十进制:0
    2、-128的补码:1000 0000
    右移一位: 1100 0000 -> 这个补码对应的原码为:1100 0000 对应十进制:-64
    右移二位: 1110 0000 -> 这个补码对应的原码为:1010 0000 对应十进制:-32
    右移三位: 1111 0000 -> 这个补码对应的原码为:1001 0000 对应十进制:-16
    右移四位: 1111 1000 -> 这个补码对应的原码为:1000 1000 对应十进制:-8
    右移五位: 1111 1100 -> 这个补码对应的原码为:1000 0100 对应十进制:-4
    右移六位: 1111 1110 -> 这个补码对应的原码为:1000 0010 对应十进制:-2
    右移七位: 1111 1111 -> 这个补码对应的原码为:1000 0001 对应十进制:-1
    右移八位: 1111 1111 -> 这个补码对应的原码为:1000 0001 对应十进制:-1
    常见应用
    左移相当于*2,只是要注意边界问题。如char a = 65; a<<1 按照*2来算为130;但有符号char的取值范围-128~127,已经越界,多超出了3个数值,所以从-128算起的第三个数值-126才是a<<1的正确结果。
    而右移相当于除以2,只是要注意移位比较多的时候结果会趋近去一个非常小的数,如上面结果中的-1,0。

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    《EffectiveJava中文第二版》 高清PDF下载
    《MoreEffectiveC++中文版》 pdf 下载
    《啊哈c语言》 高清 PDF 下载
  • 原文地址:https://www.cnblogs.com/focus-z/p/10952355.html
Copyright © 2011-2022 走看看