论坛上看到这个问题,结合了大家的智慧,写下这段代码,留给以后查阅! /* * ===================================================================================== * * Filename: one_Number_Of_Bit_String.c * * Description: * 给定一个二进制的字符串“01010101001000101111111110111010101101011110101111110101010 * 01010111110.....”,然后叫你求出这个字符串中有多少个1; * 解法一:最直接的就是遍历一遍数组,时间复杂度为O(N) * 解法二:可利用字符串在内存中的存放形式(实际是以整形数存储,只不过是ASCII的二进制) * 可以将字符串转到整形数组中,或者将数组强制转换为指向整型数的指针 * * Version: 1.0 * Created: 2010年09月30日 20时10分06秒 * Revision: none * Compiler: gcc * * Author: name (), * Company: * * ===================================================================================== */ #include <stdio.h> #include <string.h> #define N 100 int countOfOneInString(const char *str) { int *iArr = (int *)str; int iNum, len, count = 0; int i, tmp; len = strlen(str); iNum = (len / 4) + (len % 4 ? 1 : 0); // 计算可以转成多少个整型数,如果是4的倍数,当然没什么问题,但是如果不是4 // 的倍数就要求在整除4的同时还要加1,而最后一个加1的过程会用到内存中存储在 // 最后的那个结束符'/0', 而刚好'/0'的内存二进制全部是0,所以对结果没有影响; for ( i = 0; i < iNum; i++ ) { tmp = iArr[ i ] & 0x01010101; // '0'和'1'的ASCII码16进制表示为0x30,0x31;整型占4个字节,因此如果一个字符串 // "0101",那么在内存里面的存储形式就为(16进制):0x30313031, 当它和0x01010101 // 相与的时候就变成了0x00010001,结果中1的个数刚好等于字符串中1的个数; while ( tmp ) { count++; tmp &= tmp - 1; } } return count; } int main(int argc, char **argv) { char str[ N ]; scanf("%s", str); printf("%d/n", countOfOneInString(str)); return 0; }