易截截图软件、单文件、免安装、纯绿色、仅160KB

我的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)) &


相关文档:

extern "C"相关的一些细节问题

作者:石头
extern "C"包含双重含义,其一:被它修饰的目标是“extern”的;其二:被它修饰的目标是“C”的。
1)被extern “C”限定的函数或变量是extern类型的;
    extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函 ......

C++中extern “C”含义深层探索

本文关键词: c++ 含义
1.引言
C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量 ......

C 标准库 函数 源代码的实现 和 分析

//库函数实现
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;
  ......

关于c,c++输出格式控制

1.
printf("%.9lf\n",sum); 
//输出小数点后9位不省去末尾多余的0
2.
printf("%.10g\n",sum);
 //输出小数点后9位不省去末尾多余的0
3.
#include<iomanip>
cout<<setprecision(10)<<sum<<endl;
//输出小数点后9位省去末尾多余的0
4. 
#include<iomanip>
cout.pre ......

c程序的预处理,编译,连接过程。

自己搜集并且整理,用于参考。
1.完整流程:
C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件
 
 
 
pic from http://edmulroy.portbridge.com/oview.htm
 
2. c的预处理
预编译程序所完成的基本上是对源程序的& ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号