二進(jìn)制中1的位數(shù)——jzoffer

位運(yùn)算是把數(shù)字用二進(jìn)制表示之后,對每一位上0或者1的運(yùn)算。

負(fù)數(shù)的存儲

  1. 十進(jìn)制負(fù)數(shù)是以其補(bǔ)碼存儲在內(nèi)存上的。

    驗(yàn)證:求-8在內(nèi)存上以二進(jìn)制形式1的個(gè)數(shù)

    思路:拿變量,賦值為1,與-8的二進(jìn)制碼的每一位做與運(yùn)算,若與運(yùn)算結(jié)果為1,則該位為1.

    結(jié)論:輸入-8,結(jié)果為29

    分析:

    ? 在32位系統(tǒng)上,-8的存儲是以-8的補(bǔ)碼存儲在內(nèi)存中的,

    ? -8的源碼:1000 0000 0000 0000 0000 0000 0000 1000

    ? 取反,由于第一位是符號位,不用改變,得:1111 1111 1111 1111 1111 1111 1111 0111

    ? 補(bǔ)碼 = 反碼+1,得:1111 1111 1111 1111 1111 1111 1111 1000

    ? 得到1的數(shù)量正好為29,所以-8的補(bǔ)碼就是-8存儲在內(nèi)存上的二進(jìn)制碼

  2. 十六進(jìn)制,負(fù)數(shù)在內(nèi)存中存儲的是原碼

    驗(yàn)證:對int test = 0x80000001(對應(yīng)十進(jìn)制為-1) 檢查其內(nèi)存上的1的個(gè)數(shù)

    結(jié)論:2

    分析:

    ? 內(nèi)存上的原碼為 1000 0000 0000 0000 0000 0000 0000 0001

  3. 輸出0x80000000和0xFFFFFFFF

    結(jié)論:int i = 0x80000000 后,輸出i,發(fā)現(xiàn)i=-(2^31)

    ? int i = 0xFFFFFFFF 后,輸出i,發(fā)現(xiàn)i=-1

    分析:

    ? 0x800000000的二進(jìn)制原碼:1000 0000 0000 0000 0000 0000 0000 0000

    ? 在十六進(jìn)制中,負(fù)數(shù)的二進(jìn)制原碼的最高位是符號位,后面的31位為序號位,不是值位。

    ? 1后面的 000 0000 0000 0000 0000 0000 0000 0000,表示序號1,表示負(fù)數(shù)中從小到大的第一位。

    ? 由于int的最小值為-231,排在負(fù)數(shù)從小到大的序號1,所以輸出為-231。

    ? 再看0xFFFFFFFF,二進(jìn)制原碼:1111 1111 1111 1111 1111 1111 1111 1111

    ? 最高位為1,為負(fù)數(shù),序號位為 111 1111 1111 1111 1111 1111 1111 1111 = (231 - 1)

    ? 所以0xFFFFFFFF為負(fù)數(shù)從小到大第231 - 1位,即:-231 + 231 - 1 = -1,故輸出為-1

  4. 十進(jìn)制的補(bǔ)碼也符合 符號位 + 序號位 的原則

    拿-8做例子:

    -8的補(bǔ)碼:1111 1111 1111 1111 1111 1111 1111 1000,可以看到最高位為1

    序號位:111 1111 1111 1111 1111 1111 1111 1000 = 231 - 8

    則該補(bǔ)碼表示的值為 -231 + 231 - 8 = -8,符合

題目:請實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)整數(shù),輸出該數(shù)二進(jìn)制表示中1的個(gè)數(shù)。例如,把9表示成二進(jìn)制是1001,有2位是1,因此,如果輸入9,則該函數(shù)輸出2.

class Solution:
    # 常規(guī)解法
    def number_of_one(self, n):
        count = 0
        # 如果該整數(shù)是負(fù)數(shù),要把它和0xffffffff相與,消除負(fù)數(shù)的影響
        # 因?yàn)槭M(jìn)制負(fù)數(shù)是以其補(bǔ)碼存儲在內(nèi)存上的
        if n < 0:
            n = n & 0xFFFFFFFF
        while n:
            n = (n - 1) & n
            count += 1
        return count
    
    # 利用python特性
    def number_of_one_a(self, n):
        return bin(n & 0xFFFFFFFF).count("1")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 進(jìn)制基本概念 什么是進(jìn)制?進(jìn)制是一種計(jì)數(shù)的方式,數(shù)值的表示形式 常見的進(jìn)制十進(jìn)制、二進(jìn)制、八進(jìn)制、十六進(jìn)制 進(jìn)制書...
    極客江南閱讀 2,195評論 0 11
  • 網(wǎng)站亂碼問題我們會經(jīng)常碰到,大多見于非英文的中文字符或其他字符亂碼,而且,這類問題常常是因?yàn)榫幋a方式問題,主要原因...
    波段頂?shù)?/span>閱讀 3,333評論 1 9
  • http://www.itdecent.cn/p/55a8195291db本篇文章講解了計(jì)算機(jī)的原碼, 反碼和補(bǔ)...
    PupilCHen閱讀 1,281評論 1 48
  • 隔離外在的壓力和誘惑,保持平常心態(tài),回歸事物的本源,把握住我們應(yīng)該做的合理方向。 摘抄自O(shè)PPO的核心價(jià)值觀,很受...
    樂乙游閱讀 214評論 0 2
  • ■梁山雪兒 窗外風(fēng)雨驟 細(xì)說多情妹 愁幾何 風(fēng)幾何 風(fēng)雨陽光中 細(xì)說人間情 離也好 合也好 離不開 ̄座橋 連著過...
    向前的冰山來客15669閱讀 213評論 0 6

友情鏈接更多精彩內(nèi)容