zoukankan      html  css  js  c++  java
  • 二补数 (2's complement)

    二补数 (2's complement) :是一种用二进位表示有号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。

    一个数字的二补数就是将该数字作位元反向运算(即一补数),再将结果加 1,即为该数字的二补数。
    在二补数系统中,一个负数就是用其对应正数的二补数来表示。

    优点:二补数系统的最大优点是可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。
              只要一种加法电路就可以处理各种有号数加法,而且减法可以用一 个数加上另一个数的二补数来表示,因此只要有加法电路及二补数电路即可完成各种有号数加法及减法,在电路设计上相当方便。

    特点:二补数系统的 0 只有一个表示方式,这点和一补数系统不同(在一补数系统中,0 有二种表示方式),因此在判断数字是否为 0 时,只较比对一个不同的条件即可。

    具体算法:(转贴:原地址: http://entry.hit.edu.tw/~bd92046/new_page_1.htm

    二补数转换方法差异

    方法1:

    10進制轉2進制:

    <1>直接將10進制轉為2進制,正負號省略。

    <2>如果數目少於X bits,在左邊補0直到X bits。

    <3>如果是正號,不需要其他動作。

       如果是負號,使用1補數:將0變1,1變0;1補數加1,形成2補數。

    例(1):將+6以16bit儲存,使用2補數。

              +6 => 110 => 0000000000000110

    例(2):將-125以16bit儲存,使用2補數。

              -125 => 1111101 => 0000000001111101

                   => 1111111110000010 => 1111111110000011

    2進制轉10進制:

    <1>如果最左邊的bit是0(正數)。

        1-1…將數字由二進制轉為十進制。

        1-2…在數字前加+號。

    例:將0000000000000110轉為十進制(使用2補數)

           0000000000000110 => 6 => +6

    <2>如果最左邊的bit是1 (負數)。

       2-1…2補數減1,變為1補數。

       2-2…將所有的0變1;1變0。

       2-3…將數字由2進制轉為10進制。

       2-4…在數字前加-號。

    例:將1111111110000100轉為十進制(使用2補數)

           1111111110000011 => 1111111110000010

                            => 0000000001111101 => 125 => -125

    方法2:

    10進制轉2進制:

    <1>將數字改為2進制;正負號省略。

    <2>如果數目少於X bits,在左邊補0直到X bits。

    <3>如果是正號,不需要其他動作。

       如果是負號,維持最右邊的0直到第一個1(包含)不變,其餘的皆變換。

       (0變1,1變0)

    例(1):將+6以16bit儲存,使用2補數

             +6 => 110 => 0000000000000110

    例(2):將-125以16bit儲存,使用2補數

             -125 => 1111100 => 0000000001111100 => 1111111110000100

    2進制轉10進制:

    <1>如果最左邊的bit是0 (正數)。

    1-1…將數字由2進制轉為10進制。

    1-2…在數字前加+號。

    例:將0000000000000110轉為10進制(使用2補數)

           0000000000000110 => 6 => +6

    <2>如果最左邊的bit是1 (負數)。

    2-1…維持最右邊的bits不變直到第一個1(包含),其餘的皆變換。

        (0變1,1變0)。

    2-2…將數字由2進制轉為10進制。

    2-3…在數字前加-號。

    例1111111110000011轉為10進制(使用2補數)

       1111111110000010 => 0000000001111101 => 125 => -125

    二者之間的差異

    10進制轉2進制:

    方法1需要先轉換到1補數,再用1補數+1轉為2補數,使用上較為簡單,

            但計算速度比較慢。

    方法2就直接轉換成2補數,在使用上比較容易出錯,不過計算速度會比較快。

    2進制轉10進制:

    方法1須先使-1變為1補數,然後才能轉換成10進制,計算較為簡單,計算速度緩慢。

    方法2可以直接轉換,比較容易出錯,但計算速度較快。

  • 相关阅读:
    JAVA内部类详解
    表、栈和队列
    大型网站架构演化<二>
    eclipse中build path 中JDK与java compiler compliance level的问题(转)
    XFire构建服务端Service的两种方式
    SpringMVC简单例子
    Mybatis
    java静态代码块 类加载顺序问题。
    Tomcat6.0数据源配置
    解析xml的几种方式
  • 原文地址:https://www.cnblogs.com/sleepy/p/2102528.html
Copyright © 2011-2022 走看看