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

我的C实践(8):字搜索

  字搜索就搜索一个数中具有某些特征的位。实现如下:
/* wsearch.c:字搜索 */
/* 从左边寻找第一个0字节:第0(1,2,3)个字节是0时,返回0(1,2,3),否则返回4 */
int zbytel(unsigned x){
if((x>>24)==0) return 0;
else if((x & 0x00ff0000)==0) return 1;
else if((x & 0x0000ff00)==0) return 2;
else if((x & 0x000000ff)==0) return 3;
else return 4;
}
/* 方案2:无分支代码,用到了nlz指令 */
int zbytel_2(unsigned x){
int nlz(unsigned); /* 前向声明 */
unsigned y;
y=(x & 0x7f7f7f7f)+0x7f7f7f7f; /* 把0字节变成0x7f,非0字节最高位变成1 */
y=~(y | x | 0x7f7f7f7f); /* 把0字节变成0x80,非0字节变成0x00 */
return nlz(y)>>3; /* 第0(1,2,3)个字节是0时,y的前导有0(8,16,24)个0,故返回0(1,2,3),否则返回4 */
}
/* 从左边寻找第一个长为n的连续1位串,返回其位置(从0开始编号) */
int ffstr1(unsigned x, int n){
int nlz(unsigned); /* 前向声明 */
int k,p;
p=0; /* 初始化返回的位置 */
while(x!=0){
k=nlz(x);
x=x<<k; /* 跳过前导的0 */
p=p+k;
k=nlz(~x); /* 计算前导1的个数 */
if(k>=n)
return p; /* 若前导1的个数足够,则找到,直接返回其位置 */
x=x<<k; /* 否则连续的1不足n个,跳过它们,继续向前找 */
p=p+k;
}
return 32; /* 没找到则返回32 */
}
/* 计算前导0的个数 */
int nlz(unsigned x){
int n;
if(x==0) return (32);
n=1;
/* 用分治策略 */
if((x>>16)==0){ /* x<=0x0000ffff时 */
n=n+16;
x=x<<16; /* 移除前导的16个0 */
}
if((x>>24)==0){ /* x<=0x00ffffff时 */
n=n+8;
x=x<<8; /* 移除前导的8个0 */
}
if((x>>28)==0){ /* x<=0x0fffffff时 */
n=n+4;
x=x<<4; /* 移除前导的4个0 */
}
if((x>>30)==0){ /* x<=0x3fffffff时 */
n=n+2;
x=x<<2; /* 移除前导的2个0 */
}
return n-(x>>31); /* 注意n初始时为1,如果移除前导0后的x最高位为0,则n恰好计算了这个0;
如果最高位为1,则没有额外的前导0,n必须要减去多出的1 */
}


相关文档:

c / c++ /vc 的一些小知识

打开文件或者程序
1、ShellExecute(0,"open","c:\\abc.exe","","",SW_SHOW);
2、WinExec("c:\\a.exe",SW_SHOW);
3、system("dir c:\\");
关闭文件
m_hwnd = FindWindows("Notepad","a.txt-记事本");
SendMessage(m_hwnd,WM_SYSCOMMAND,SC_CLOSE,0);
隐藏DOS窗口
#pragma comment( linker, "/subsystem:\"windows\" ......

linux内核移植s3c2410,移植正式开始2

内核启动的现在已经是开始执行函数start_kernel函数了。start_kernel函数在init/main.c中定义。start_kernel函数只是完成
相应的结构的初始化任务。
    printk(KERN_NOTICE);
    printk(linux_banner);
    setup_arch(&command_line);
在uboot的一直过程中,uboo ......

C 发现个全局变量与局部变量的区别

发现个全局变量与局部变量的区别:
[code=C/C++]
char** t;
main()
{
    char c[1];
    char** t1;
    sprintf(c,"%d",t);
    printf("t=%s---\n",c);
    if(strcmp(c,"0")!=0)
  &nbs ......

C/S 与 B/S 的区别


 C/S 与 B/S 
1.硬件环境不同: 
  C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.
  B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行&n ......

又是3只C。。。= =

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 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号