原碼 反碼 補碼的計算 劍指office

題目描述

輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示。

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        sun=0
        for i in range(32):
            if n>>i&1:
                sun+=1
        return sun

解釋:

  • 原碼

    原碼錶示法最高位爲符號位,該位爲0表示正數,1表示負數。其餘位表示數的絕對值。

  • 反碼

    對於一個帶符號的數來說,正數的反碼與其原碼相同;負數的反碼爲其原碼除符號位以外的各位按位取反。反碼常用來做求補碼過程中的中間形式。

  • 補碼

    正數的補碼與其原碼和反碼相同;負數的補碼是對它的原碼除符號位以外各位取反,並在末位加1而得到,即爲該數的補碼加1。計算機內的數一般以補碼形式表示。在補碼中用(-128)D代替了(-0)D,注意:(-128)D沒有相對應的原碼和反碼,(-128)D = (1000,0000)B。

  • 求補運算

    求補運算不考慮符號位,對它的原碼各位取反,並在末位加1而得到。對一個數進行求補運算所得的是該數相反數的補碼。有一個方法可以快速進行求補運算,從右邊數起,直到第一個1(包括其自身)之間的位值不變,其餘位求反就是結果。
    附:分析2-1=1在計算機內的運算原理(假設機器字長爲8位)

使用補碼:2-1=2+(-1) (即將符號位交給1使1變成-1)

-1的原碼:1000,0001
按位取反:1111,1110 (注意:最高位即符號位不參與取反運算)
-1的補碼:1111,1111

   2 : 0000,0010 補碼
+ -1 : 1111,1111 補碼
 ______________________
       1,0000,0001 補碼 -> 最高位溢出丟棄 -> 0000,0001 補碼/原碼 -> (1)D

求補運算:2-1=2+(1的相反數) (即減去1等於加上1的相反數)

1的原碼 :0000,0001
各位取反:1111,1110
末位加1 :1111,1111 (即爲-1的補碼,也就是1相反數的補碼)

    2 : 0000,0010 補碼
+  -1 : 1111,1111 補碼
______________________
        1,0000,0001 補碼 -> 最高

位溢出丟棄 -> 0000,0001 補碼/原碼 -> (1)D

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章