二进制操作也十分有趣

问题:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此输入9,函数返回2。

最初的想法就是对右侧第一位检查是否为1,然后利用n = n >> 1语句,依次对第二位,...,第n位进行比对,代码很简单如下

int b1(int n)
{
    int count = 0;
    while(n){
        if (n & 1)  count++;
        n = n >> 1;
    }
    return count;
}

然而很快问题便浮现了,当你输入一个负数时,程序将陷入死循环,因为在不停的移位过程中n变成了0xffff;
书本上给出了本题的正确解法:

int b2(int n)
{
    int count = 0;
    while(n){
        ++ count;
        n = (n-1)&n;
    }
    return count;
}

我则根据C语言中int类型大小为4个字节——即32位将第一个函数简单修改成如下:

int b1_1(int n){
    int count = 0,i;
    for(i = 0; i < 32; i++){
        if(n & 1)   count++;
        n = n >> 1;
    }
    return count;
}

在做一个简单的测试函数,利用时间函数生成了100个-1000~1000的随机数进行测试,二者答案完全相同。完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int b1_1(int n)
{
    int count = 0;
    while(n){
        ++ count;
        n = (n-1)&n;
    }
    return count;
}

int b2(int n){
    int count = 0,i;
    for(i = 0; i < 32; i++){
        if(n & 1)   count++;
        n = n >> 1;
    }
    return count;
}

int main(){
    srand(time(0));
    int i,r;
    for(i = 0; i < 100; i++){
        r = rand() % 2001 - 1000;
        if(xxx(r) != yyy(r)){
            printf("you are a liar!/n");
            return 0;
        }
    }
    printf("Congratulations!\n");
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 201. M-Q型显影液组合是()。 (2.0 分) A. 米吐尔与菲尼酮的组合 B. 对苯二酚和菲尼酮的组合 C...
    我们村我最帅阅读 3,667评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,993评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 实现:子类化UIWindow,并使app使用自定义的这个window。(也可以子类化UIApplication,修...
    竖着走的大闸蟹阅读 1,251评论 0 0
  • 继续昨天的练习,这两天跟logo较劲有点一发不可收拾了,一方面因为确实是喜欢,另一方面也是因为明天动画库要跟...
    爱睡觉de猪阅读 265评论 2 1