我的C实践(7):位计数
位计数就是对一个数中具有某些特征的位进行计数。看下面实现:
/* bitscount.c:位计数 */
/* 计算x中1位的数目:方案1,采用分治策略 */
inline int pop(unsigned x){
/* 对每个2位字段,先析出其右端的1位,再析出其左端的1位,然后让这两个位相加 */
x=(x & 0x55555555)+((x>>1) & 0x55555555);
/* 对每个4位字段,先析出其右端2位字段,再析出其左端2位字段,然后让这两个2位字段相加 */
x=(x & 0x33333333)+((x>>2) & 0x33333333);
/* 对每个8位字段,先析出其右端4位字段,再析出其左端4位字段,然后让这两个4位字段相加 */
x=(x & 0x0f0f0f0f)+((x>>4) & 0x0f0f0f0f);
/* 对每个16位字段,先析出其右端8位字段,再析出其左端8位字段,然后让这两个8位字段相加 */
x=(x & 0x00ff00ff)+((x>>8) & 0x00ff00ff);
/* 最后让两个16位字段相加 */
x=(x & 0x0000ffff)+(x>>16);
return x;
}
/* 方案2:用公式sum_digits(z)=z-[z/2]-[z/4]-...-[z/2**(n-1)],
并结合分治策略来计算 */
inline int pop_2(unsigned x){
unsigned n;
n=(x>>1) & 0x77777777; /* 对每个4位字段z,计算[z/2] */
x=x-n; /* 计算z-[z/2] */
n=(n>>1) & 0x77777777; /* 计算[z/4] */
x=x-n; /* 计算z-[z/2]-[z/4] */
x=(x+(x>>4)) & 0x0f0f0f0f; /* 对每相邻的两个4位字段相加,扩展成4个8位字段 */
x=x*0x01010101; /* 乘以0x01010101,即把这4个字节相加,
结果存放在最高阶的那个字节中 */
return x>>24;
}
/* 方案3:通过x&(x-1)不断地把最右侧的1位改成0位,并记录下这样的修改次数,直到x变成0 */
inline int pop_3(unsigned x){
int n=0;
while(x!=0){
++n;
x=x & (x-1);
}
return n;
}
/* 计算整个数组中的1位数目 */
int pop_array(unsigned A[], int n){
register int i,j,lim;
register unsigned s,s8,x;
s=0;
for(i=0;i<n;i=i+31){
lim=n <= i+31 ? n : i+31;
s8=0;
for(j=i;j<lim;++j){
x=A[j];
x=x-((x>>1) & 0x55555555); /* 变成16个2位字段 */
x=(x & 0x33333333)+((x>>2) & 0x33333333); /* 变成8个4位字段 */
x=(x+(x>>4)) &
相关文档:
问题:用J2ME做基于手机的C/S模式游戏的流程
查看该问题完整内容如果可以 请介绍下服务器和客户端等方便的内容回答:这些在百度上不好问,去CSDN问用什么语言做都是一样的,你用J2ME做自然是可能要在手机上用,看你要通过蓝牙还是GPRS,但是编程上本质区别不大,底层都是透明的。如何建立连接,通信这些应该明白吧, ......
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可
以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员
按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个 ......
作者:石头
extern "C"包含双重含义,其一:被它修饰的目标是“extern”的;其二:被它修饰的目标是“C”的。
1)被extern “C”限定的函数或变量是extern类型的;
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函 ......
发信人: RoachCock (反动学术权威), 信区: CPlusPlus
标 题: extern "C" 阅读笔记
发信站: 水木社区 (Fri Mar 7 00:22:47 2008), 站内
本以为很简单,仔细阅读了一下 C++ 标准,发现内容还不少。总结了一下。
要点:
函数类型,函数名,变量名具有语言链接性,language linkage。
语言链接性可能会影响到 ......
//库函数实现
char *strcat (char *dst, const char *src)
{
char *p = dst;
while (*p)
p++;
while ((*p++ = *src++))
;
return dst;
}
char *strncat (char *s1, const char *s2, long unsigned int n)
{
char *dest = s1;
  ......