国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

二進制中1的個數

2019-11-08 02:20:38
字體:
來源:轉載
供稿:網友

二進制中1的個數

1、普通做法,每次除2取余位1則加1:

#include <stdio.h>int main(){ int num = 15; int count = 0; int i = 0; for (i = 0; i <= 32;i++)//while(num) { if (num % 2 == 1) { count++; } num = num / 2; } 正數的話問題,但是一個是效率比較差,一個是負數的時候有錯,而且可能會溢出(變成小數什么的)

2、優化:可以使用向右移位代替除2運算:num=num>>1;(右移運算只是返回一個移位之后的值,但是移位的值本身不改變) 右移分邏輯一位位和算數移位。無符號數執行邏輯移位,右移一位,左邊補0;有符號數執行算數移位,右移一位,左邊補符號位(負數補1,正數補0)

但是負數還是有問題

3、優化:使用按位與運算代替求模運算:if ((num&1)==1)

但是負數還是會有問題

4、 對于負數來說,和正數會有不同的地方,例如-1的補碼: 原碼: 10000000 00000000 00000000 00000001 反碼: 11111111 11111111 11111111 11111110(符號位不變,其余按位取反) 補碼: 11111111 11111111 11111111 11111111(反碼加1) 這時候使用上邊的方法將達不到目的。。。

#include <stdio.h>int main(){ int num = -1; int count = 0; while (num) { count++; num = num&(num - 1); } printf("%d/n", count); return 0;}

使用n&(n-1),這樣的話每次循環直接找到一個位位1的地方處理,相對于前面的方法來說,這個方法只需要循環二進制數中1的個數次,而不需要每一個數都運行32次,而且針對負數也能完美解決問題 來源: http://blog.csdn.net/Bulletproof_Circle/article/details/51242742


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屯昌县| 桑日县| 西平县| 长子县| 丹棱县| 芷江| 衡南县| 忻城县| 加查县| 驻马店市| 墨竹工卡县| 赤壁市| 呼和浩特市| 桦川县| 白沙| 靖西县| 旬邑县| 当涂县| 石楼县| 新和县| 甘孜县| 文水县| 济宁市| 吴堡县| 横山县| 棋牌| 宁化县| 晋宁县| 北川| 图木舒克市| 聊城市| 海口市| 孝感市| 铜梁县| 博野县| 酉阳| 安阳市| 开鲁县| 兰考县| 固原市| 桂东县|