問題:
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。
解題思路:
因為負數用補碼表示,對於負數右移時,在最高位補得是1,因此負數移位位產生無限個1,陷入死迴圈。
出現死迴圈的錯誤答案:
int
numberof1_cannotuse
(int n)
//把n的2進製形式往右推一位
n = n >>1;
//負數右移,首位補一,導致無數個1
}return count;
}
答案1:解決負數死迴圈問題
思想:當n為負數的時候,可以將最高位的符號位1變成0,就是n & 0x7fffffff,這樣就把負數轉化成正數了,唯一差別就是最高位由1變成0,因為少了乙個1,所以count加1。之後再按照while迴圈裡處理正數的方法來操作就可以啦!
int
numberof1
(int n)
while
(n !=0)
return count;
}
答案2:用1左移
思想:用1(1自身左移運算,其實後來就不是1了)和n的每位進行位與,來判斷1的個數
int
numberof1_low
(int n)
flag = flag <<1;
}return count;
}
答案3:最優解:用(n - 1) & n
int
numberof1
(int n)
return count;
}
引用:
1、題目**於牛客網:二進位制中1的個數
1、善於利用以為運算子和按位與&。
統計二進位制中1的個數
題目 統計乙個無符號數中的二進位制表示中1的個數。此演算法名為平行計算法。基本思想如下 先兩兩 兩個二進位制位 分組統計每組出現的1的個數,而每組1的個數只可能是0個 00 1個 01 或2個 10 由 相加所得的 兩位的二進位制完全可以表示每組 兩個二進位制數 中1的個數 接著四四 4個二進位制位...
二進位制 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...
統計二進位制中1的個數(彙編)
data segment str db the result is data ends code segment assume cs code,ds data start mov ax,data mov ds,ax mov dx,offset str mov ah,09h 輸出字串的功能,但是使用前...