最近在学习大牛Bryant O'Hallaron 的深入理解计算机系统,发现学了这么久的程序设计,其实有些基本的东西还不太了解,这不,这两天在恶补整数,浮点数在计算机中的表示,并且开始做上面的习题,

因为刚开始,主要是做位运算方面的练习,这个以前没怎么重视,但是实在太重要了,搞不清楚位运算的别说自己编程很NB!

书里正好有这么一道习题2.65,就是检测一个无符号数的数位是否有偶数个1,而且要求不能超过12次基本运算!!那么,我就根据位运算中异或的想法来实现,这个想法就是,偶数位的个数实际上就是这个无符号整数中

所有1的和,那么对于32位的无符号整数,比如x1x2x3x4(xi=1字节),那么 x1x2^x3x4其实就是他们高2字节和低2字节的1的和(mod2),这样如果相同位上都有1的话,那么异或得0,其实就是模去了一个偶数,而奇数是

不会被模去的,结果是y1=x1x2^x3x4=y2,接下来再 y1^y2=z1,以此类推,直到最后剩下一位,如果这一位是0,则说明有偶数个2,否则就是奇数个2了,具体实现如下:

1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define UINT_LEN 4
  4
  5 //因为使用了循环,实际计算次数略多,但是并不影响题目的本质,如果不用循环则满足要求,而且本代码可以适用到64位整数上,只要定义UNIT_LEN 5
  6 int even_ones(unsigned x){
  7     int u = 1<<UINT_LEN;
  8     int p=UINT_LEN-1;
  9     unsigned tx=x;
 10     unsigned ty=x>>u;
 11     printf("0: u=%d, tx=%x, ty=%x\n",u,tx,ty);
 12     while(p>=-1){
 13         tx = tx^ty;
 14         u = u>>1;
 15         ty = tx>>u;
 16         printf("%d, u=%d, tx=%x, ty=%x\n",UINT_LEN-p,u,tx,ty);
 17         p--;
 18     }
 19     int odd = tx&1;
 20     return !odd;
 21 }
 22
 23 int main(int argc,char** argv){
 24     if(argc!=2){
 25         perror("incorrect number of arguments!\n");
 26         exit(1);
 27     }
 28
 29     unsigned u=(unsigned) atoi(argv[1]);
 30
 31     even_ones(u)? printf("%d has even 1s!\n",u):printf("%d has odd 1s!\n",u);
 32     return 0;
 33 }

最新文章

  1. ios 开发需要看的书籍
  2. hdu1032 Train Problem II (卡特兰数)
  3. jQuery属性/CSS使用例子
  4. Android学习笔记(七)——常见控件
  5. oracle 驱动安装备忘
  6. loadrunner获取Http信息头中指定值作为参数
  7. Eclipse下Ruby的配置]
  8. [drp 7]转发和重定向的区别
  9. TopFreeTheme精选免费模板【20130619】
  10. ASP.Net Core的Code Fist代码先行操作方法
  11. Python学习案例之人脸检测识别
  12. (原)tensorflow使用eager在mnist上训练的简单例子
  13. Java客户端连接kafka集群报错
  14. 并发研究之Java内存模型(Java Memory Model)
  15. zTree变异篇:如何让同级树节点平铺而非垂直显示
  16. hdfs命令大全
  17. Composer更新慢的终极解决方案
  18. 混合欧拉回路的判断(Dinic)
  19. 鸡肋提权之变态root利用
  20. 转:javascript判断IE浏览器

热门文章

  1. Python 之 时间字符串、时间戳、时间差、任意时间字符串转换时间对象
  2. 第一篇英文短文《It All Starts With A Dream》
  3. 十二、shapes
  4. Linux top命令排序
  5. SVN Cornerstone 报错信息 xcodeproj cannot be opened because the project file cannot be parsed.
  6. 1、win32创建窗口函数(windows程序内部运行机制)
  7. DataTable转List&lt;dynamic&gt;
  8. java学习第14天(集合的框架和基本遍历)
  9. CentOS 6下Apache的https虚拟主机实践
  10. 答:SQLServer DBA 三十问之三:有哪些操作会使用到TempDB;如果TempDB异常变大,可能的原因是什么,该如何处理