计算二进制中1的个数

计算二进制中1的个数的方法有遍历法、公式法、位运算、查表发、递归法。

1、遍历法

判断是否为1,并累加计数。这种方法的时间复杂度是O,其中n是整数的大小。例如,对于整数10,其二进制表示为1010,遍历四位,发现有两个1,所以返回2。

2、公式法

使用n &= (n - 1)。这个公式可以将整数的最低位的1变成0,重复执行这个操作,直到整数变为0,操作的次数就是1的个数。

这种方法的时间复杂度是O(k),其中k是1的个数。例如,对于整数6,其二进制表示为110,执行一次公式后变为100,再执行一次公式后变为0。

3、位运算

这种方法利用了二进制数的特性,每次将一个数和它减一的数做按位与运算,可以消除最低位的1,直到这个数变为0。这个过程中,需要做的运算次数就是这个数中1的个数。

如果一个数是101100,那么它减一后是101011,两者按位与得到101000,消除了最低位的1。再重复这个过程,得到100000和011111,按位与得到000000,消除了第二个1。最后,这个数变为0,说明它有两个1,也就是做了两次运算。

4、查表法

这种方法利用了一个预先计算好的表,存储了每个小于256的数中1的个数。然后将一个大于256的数分成四个字节每个字节8位),分别在表中查找对应的1的个数,并将它们相加。

这种方法可以减少运算次数,但需要额外的空间存储表。例如,如果一个数是1011001100001111,那么它可以分成两个字节:10110011和00001111。在表中查找它们对应的1的个数分别是4和4,相加得到8。

5、递归法

这种方法利用了一个递归公式,将一个数分成两半,分别计算左半部分和右半部分中1的个数,并将它们相加。这种方法可以将问题规模缩小,但需要额外的栈空间存储递归调用。

如果一个数是1011001100001111,那么它可以分成两半:10110011和00001111。然后递归地计算它们中1的个数,并将它们相加。



  • 璁$畻浜岃繘鍒朵腑1鐨勪釜鏁
    绛旓細璁$畻浜岃繘鍒朵腑1鐨勪釜鏁扮殑鏂规硶鏈夐亶鍘嗘硶銆佸叕寮忔硶銆佷綅杩愮畻銆佹煡琛ㄥ彂銆侀掑綊娉銆1銆侀亶鍘嗘硶 鍒ゆ柇鏄惁涓1锛屽苟绱姞璁℃暟銆傝繖绉嶆柟娉曠殑鏃堕棿澶嶆潅搴︽槸O锛屽叾涓璶鏄暣鏁扮殑澶у皬銆備緥濡傦紝瀵逛簬鏁存暟10锛屽叾浜岃繘鍒惰〃绀轰负1010锛岄亶鍘嗗洓浣嶏紝鍙戠幇鏈変袱涓1锛屾墍浠ヨ繑鍥2銆2銆佸叕寮忔硶 浣跨敤n &= (n - 1)銆傝繖涓叕寮忓彲浠ュ皢鏁存暟鐨勬渶浣...
  • 璁$畻涓涓暟鐨浜岃繘鍒琛ㄧず涓湁澶氬皯涓1
    绛旓細璁$畻鏈洪噷鐨勬暟瀛楁湰鏉ュ氨鏄敤浜岃繘鍒跺瓨鐨勶紝鎵浠ヨ绠楄繃绋嬩篃閮芥槸浜岃繘鍒惰绠銆傚埄鐢ㄤ竴浜涗綅杩愮畻鐨勭壒鎬э紝鍙互寰堝鏄璁$畻1鐨勪釜鏁銆傛湁涓涓緢鏈夋剰鎬濈殑鐗规э細闅忎究缁欎竴涓簩杩涘埗鏁帮紝姣斿n=10001100锛屾垜浠妸瀹冨噺涓锛歯-1=10001011銆傞噸鏂版憜鏀句竴涓嬭瀵燂細10001100 (n)10001011 (n-1)閫氳繃瑙傚療寰楀嚭锛宯涓负1鐨勬渶浣庝綅鏄3...
  • 鐢浜岃繘鍒琛ㄧず鍗杩涘埗1-128,姣忎竴浣嶄笂1鐨勪釜鏁鏄灏?
    绛旓細鐢浜岃繘鍒琛ㄧず鍗杩涘埗1-8, 鍒嗗埆鏄1锛10,11,100锛101,110,111,1000锛屾瘡涓浣嶄笂1鐨勪釜鏁鏄13.鍏朵腑锛屼釜浣嶄笂1鍑虹幇浜2^2=4娆★紝鍗佷綅涓1鍑虹幇浜2^2=4娆★紝鐧句綅涓1鍑虹幇浜嗕簡2^2=4娆,鍗冧綅涓1鍑虹幇浜1娆★紝4+4+4+1 =3*2^2+1 =13 鐢ㄤ簩杩涘埗琛ㄧず鍗佽繘鍒1-16, 鍒嗗埆鏄1锛10,11,100锛101,110,1...
  • 杈撳叆涓涓暣鏁,姹傝鏁存暟鐨浜岃繘鍒琛ㄨ揪涓湁澶氬皯涓1
    绛旓細閫氳繃妯2鍒ゆ柇鏈鍚庝竴浣嶆槸鍚︿负1锛屼负1鍒機OUNT++,鐒跺悗闄2锛堢浉褰撲笌灏嗚鏁板彸绉讳竴浣嶏級锛屽惊鐜紱鏈缁堟眰鍑虹粨鏋溿傚疄鐜板涓嬶細锛圕瀹炵幇锛 #include<stdio.h> void main() { int i,count=0; scanf("%d",&i); //杈撳叆涓涓暟i銆傚皬鏁伴儴鍒嗚浣跨敤鈥滀箻 2 鍙栨暣娉曗濄傚嵆鐢ㄥ崄杩涘埗鐨灏忔暟涔樹互 2 骞跺彇璧扮粨鏋滅殑鏁存暟...
  • c璇█浣嶈繍绠 姹1涓暣鏁扮殑浜岃繘鍒舵暟鏈夊灏戜釜1
    绛旓細ans++,n&=(n-1); return ans;}int main(){ int n; scanf("%d",&n); printf("%d鐨勪簩杩涘埗鏁版湁%d涓1銆俓n",n,solve(n)); return 0;}绗簩绉嶆柟娉曪細閫氳繃涓嶆柇鐨勫幓鎺変簩杩涘埗涓渶鍙崇鐨1锛屾潵璁$畻鏁存暟浜岃繘鍒朵腑1鐨勪釜鏁锛屾椂闂村鏉傚害鍜屼簩杩涘埗涓1鐨勪釜鏁版湁鍏炽
  • c璇█鍒ゆ柇浜岃繘鍒朵腑1鐨勪釜鏁
    绛旓細c璇█鍒ゆ柇浜岃繘鍒朵腑1鐨勪釜鏁锛歩nclude <stdio.h> void dec2bin(int x){ if(x>1)dec2bin(x/2);printf("%d",x%2);} int count1(int x){ int n;for(n=0; x; x/=2)n+=x%2;return n;} int main(){ int x;scanf("%d",&x);dec2bin(x);printf("\n%d鐨勪簩杩涘埗涓湁%d涓1...
  • c璇█濡備綍灏嗚緭鍏ョ殑鏁拌〃绀烘垚浜岃繘鍒,骞剁粺璁″叾涓1鐨勪釜鏁?
    绛旓細鐢ㄦ垜浠钩鏃跺崄杩涘埗杞崲浜岃繘鍒剁殑绠楁硶锛屽嵆鐭櫎娉曘備緥濡:x&(x-1) 褰搙=5鏃讹紝 5鐨勪簩杩涘埗鏄0101 0101 & (0101-1) == 0101 & 0100 == 0100 0100 & (0100-1) == 0100 & 0011 == 0000 涓鍏璁$畻浜嗕袱娆★紝涔熷氨鏄5鐨浜岃繘鍒舵暟涓鍏卞彧鏈2涓1.涓嬮潰鏄唬鐮佸疄鐜帮細
  • 蹇熺殑鍒ゆ柇涓涓暟鐨浜岃繘鍒朵腑鏈夊灏戜釜1
    绛旓細鍗筹細ai=1銆傛鏃舵湁锛歺 =an-1an-2...ai+1100...0 <1>(x-1) =an-1an-2...ai+1011...1 <2>寰堟槑鏄撅紝浠庡紡1鍜屽紡2鍙互寰楀嚭锛屽湪绗涓娆 x & (x-1) 鍚庯細x=an-1an-2...ai+1000...0涔嬪悗閲嶅鍚屾牱鎿嶄綔锛岀洿鍒皒鐨浜岃繘鍒浣嶄腑娌℃湁1涓烘浠庝笂闈㈠彲浠ョ湅鍑猴紝姣忔墽琛岃繃涓娆 x & (...
  • ...鏁拌浆鎹负2杩涘埗鏁,鐒跺悗缁熻杩欎釜2杩涘埗鏁0鍜1鐨勪釜鏁銆備粖澶╄鍦ㄧ嚎绛塤鐧...
    绛旓細}//缁熻浜岃繘鍒朵腑1鐨勪釜鏁 printf("浜岃繘鍒朵腑1鐨勪釜鏁颁负锛%d\n",cnt);printf("浜岃繘鍒朵腑0鐨勪釜鏁颁负锛%d\n",len-cnt);} void DecimalToBinary(int var)//鍗佽繘鍒惰浆浜岃繘鍒跺嚱鏁 { int i=0;if(var==0){ str[0]='0';str[1]='\0';} else { while(var!=0){ str[i++]=var%2+48;...
  • 缂栫▼姹16浣浜岃繘鍒鏁涓1鐨勪釜鏁?
    绛旓細鍒ゆ柇(x >> n) & 0x0001鏄惁涓1,濡傛灉涓1閭d箞涓暟++,x涓鸿姹傚嚭鐨勬暟,n鏄涓涓惊鐜噺
  • 扩展阅读:二进制对照表大全 ... 2进制计算器在线 ... 一张图看懂二进制 ... 1-100二进制对照表 ... 二进制在线计算 ... 十进制对照表 ... 二进制的计算公式 ... 8位二进制拨码表图 ... 二进制算法最简单教程 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网