我的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)) &
相关文档:
昨天晚上在看C/C++对数据库的操作,猛然间觉得十分亲切,因为其中很多函数都和PHP中对MySQL操作相同,这是才想起PHP是C演化而来的。经过一番捣腾,终于完成了一个简单的程序,但是仍然存在着一个严重的问题,就是从数据库中得到的结果在屏幕上显示的是乱码,很让人烦。还望高手们赐教!
1.在机器上装上MySQL ,假设安装在 C ......
POSIX标准定义的头文件
<dirent.h> 目录项
<fcntl.h> 文件控制
<fnmatch.h> 文件名匹配类型
<glob.h> 路径名模式匹配类型
<grp.h> ......
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/S 与 B/S
1.硬件环境不同:
C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.
B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行&n ......
1.写出两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
#include<stdio.h>
int gcd(int,int);
int lcm(int,int);
int gcd(int m,int n)
{
if(m%n==0)
return n;
else
return gcd(n,m%n);
}
int lcm(int m,int n)
{
return m*n/(gc ......