最近在学习大牛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. 关于 iOS 10 中 ATS 的问题

    本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新. WWDC 15 提出的 ATS (App Transport Security) 是 ...

  2. HDU 1754 I Hate It(线段树单点替换+区间最值)

    I Hate It [题目链接]I Hate It [题目类型]线段树单点替换+区间最值 &题意: 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 ...

  3. python(29)强大的zip函数

    zip函数:它是python的内建函数,(与序列有关的内建函数有:sorted().reversed().enumerate().zip()),其中sorted()和zip()返回一个序列(列表)对象 ...

  4. sql server 常见问题笔记

    1.关于复制类型 快照发布:发布服务器按预定的时间间隔向订阅服务器发送已发布数据的快照. 事务发布:在订阅服务器收到已发布数据的初始快照后,发布服务器将事务流式传输到订阅服务器. 对等发布:对等发布支 ...

  5. android的四层体系结构,基于mvc三层结构浅析

    从多方面理解Android体系结构 1.以分层的方式来看Android 安卓体系结构分为四层. 首先看一下官方关于Android体系结构的图: 1).Linux Kernel:负责硬件的驱动程序.网络 ...

  6. linux pxe+dhcp+nfs+tftp

    yum -y install vsftpd dhcp xinetd tftp-server syslinux(安装"syslinux"才有pxelinux.0) tftp 服务(v ...

  7. .Net中的泛型(where T : class的含义)

    Eg: class A<T>where T:new() where表明了对类型变量T的约束关系.where T: A表示类型变量是继承于A的,或者是A本身.where T:new()指明了 ...

  8. 【VB6】vbRichClient5.cWebServer实现一个简单web服务器

    Option Explicit Private WithEvents k As vbRichClient5.cWebServer Private Sub Command1_Click() Set k ...

  9. [JavaScript]顺序的异步执行

    我们知道,在适用js的时候,程序是单线程执行的,而且如果遇到阻塞就会将浏览器卡死. 能否异步的执行,让程序不再卡呢? 可以,用setTimeout. 但是,问题又来了,如果我有这样的要求: 执行一个函 ...

  10. 关于reset.css的疑问:为什么一定要重置浏览器样式?

    自开始做前端算起,我所做过的每一个项目中都会有一个reset.css,也就是重置样式表.我现在想想都不知道第一次是从哪儿弄来的一个重置样式表.快五年了,好像从来都没有质疑过关于重置样式表的内容. 这样 ...