最近在学习大牛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 }

c语言,检测一个无符号整数中是否有偶数位个1的更多相关文章

  1. 在SQLSERVER中如何检测一个字符串中是否包含另一个字符串

    --当charindex返回值大于0时则包含 为0不包含 select CHARINDEX('456','123456')   SQL语句使用CHARINDEX函数,来测试一个字符串中是否包含另一个字 ...

  2. 在sql server中如何检测一个字符串中是否包含另一个字符串

    select CHARINDEX('456','123456')   SQL语句使用CHARINDEX函数,来测试一个字符串中是否包含另一个字符串中的方法: 一.CHARINDEX函数介绍 1.函数功 ...

  3. c语言统计一个文件中的单词,字符和行数

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  4. C语言统计一个字符串中单词的个数

    假定每一个单词用空格隔开. 样例: 输入:how are you! 输出:3 两种方法: 一: #include <stdio.h> #include <string.h> # ...

  5. javascript中检测一个变量的类型

    /** * 怎么检测一个变量的类型? * 在js中检测对象类型主要有三种:typeof, instanceof, constructor, 这几种都可以检测对象的类型. * 另外还可以适应jQuery ...

  6. 在PHP中检测一个类是否可以被foreach遍历

    在PHP中,我们可以非常简单的判断一个变量是什么类型,也可以非常方便的确定一个数组的长度从而决定这个数组是否可以遍历.那么类呢?我们要如何知道这个类是否可以通过 foreach 来进行遍历呢?其实,P ...

  7. C语言学习_C如何在一个文件里调用另一个源文件中的函数

    问题 C如何在一个文件里调用另一个源文件中的函数,如题. 解决办法 当程序大了代码多了之后,想模块化开发,不同文件中存一点,是很好的解决办法,那我们如何做才能让各个文件中的代码协同工作呢?我们知道,m ...

  8. C语言:一个数组中只有两个数字是出现一次

    //1.一个数组中只有两个数字是出现一次, //其他所有数字都出现了两次. //找出这两个数字,编程实现.a //^=单独两个数的^结果 //单独出现的两个数不同位的标记 //position: ^结 ...

  9. C语言:利用指针解决:统计一个长度为2的字符串在另外一个字符串中出现的次数。

    //统计一个长度为2的字符串在另外一个字符串中出现的次数. #include <conio.h> #include <stdio.h> #include <string. ...

随机推荐

  1. R语言-基本图形

    barplot() 条形图 spine() 棘状图 pie() 饼图 hist() 直方图 plot(density(x))核密度图 boxplot(X) 箱线图 vioplot() 小提琴图 dot ...

  2. C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是"模板消息"的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信 ...

  3. OAF_开发系列02_实现OAF页面的通过个性化多语言开发国际化(案例)

    2014-06-10 Created By BaoXinjian

  4. Unable to find messages file 'cscui.dll' 问题解决

    之前在工作机器上安装VS 2015卡死,结束进程,安装失败一直无法使用,昨天下班开着电脑把VS 2015卸载了,今天早上来,以前正确的项目现在生成都报错 "Unable to find me ...

  5. #!/usr/bin/env python与#!/usr/bin/python的区别

    [摘自:http://blog.csdn.net/wh_19910525/article/details/8040494] 一般的python文件的开头都有#!/usr/bin/python.这是什么 ...

  6. ACM入门

    1.给n个数字,将它们重新排序得到一个最大的数字 例子 4123 124 56 90--------------90561241235123 124 56 90 9------------990561 ...

  7. 扁平设备树(FDT)

    组成 扁平设备树主要由4大部分组成:头部(header),预留内存块(memory reservation block),结构块(struct block)和字符串块(strings block).这 ...

  8. 线程,yield让出cpu调度

    public class Yield01 extends Thread { public static void main(String[] args) { new Yield01().start() ...

  9. W5200移植W5500驱动教程

    说明,移植例程为我按照这个教程移植的例程,测试通过.工程模板为我经常使用的一个w5500模板,可以在里面直接添加文件编程.1. 将driver文件夹中W5500文件夹和所有.c文件复制到工程/sour ...

  10. Ambari 不能配置 Kafka 监听host的问题

    问题:Ambari下Kafka多IP监听配置 环境:Ambari 1.7.0 , Hadoop 2.2 Kafka 0.8.1.2.2.0.0 现象: Ambari 中是不能配置Kafka的host. ...