美文网首页
二进制操作也十分有趣

二进制操作也十分有趣

作者: 胡丽亚与石乐志 | 来源:发表于2017-03-27 20:30 被阅读0次

问题:请实现一个函数,输入一个整数,输出该数二进制表示中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;
}

相关文章

  • 二进制操作也十分有趣

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

  • Java位操作相关知识总结

    位操作 位操作即将数字转为二进制形式后,按照二进制位进行操作,位操作主要包括如下几种。 & 按位与1 & 1 = ...

  • Python进阶

    Python二进制表示和位操作 Python二进制表示和位操作 - 简书 OpenH264/libSRTP/lib...

  • Java基础系列-二进制操作

    原创文章,转载请标注出处:《Java基础系列-二进制操作》 概述 Java源码中涉及到大量的二进制操作,非常的复杂...

  • redo日志、undo日志、binlog日志与doublewri

    binlog日志 (二进制日志) 二进制日志记录了对MySQL数据库执行更改的所有操作,它是一种逻辑操作,其记录的...

  • MySQL 二进制日志的使用

    本文的操作环境是 macOS Mojave 10.14.1, mysql 5.7.19 二进制日志的作用 二进制日...

  • 日志管理

    日志管理 日志介绍 错误日志 二进制日志 案例 gtid 案例 二进制日志其他操作 慢日志 分析

  • 有趣

    有趣不是一味地乖 得有几分灵和怪 有趣不是十分醒 难得的糊涂必须在心怀 有趣也不求十分的灵 还有娘胎里带来的萌和呆...

  • 快手产品体验

    一.产品简介 快手App是一个娱乐化的短视频社区,软件操作简单,可以十分方便地分享自己有趣的生 活瞬间,也可以发现...

  • JavaScript 二进制数组(ArrayBuffer、Typ

    前言 二进制数组是JavaScript用来操作二进制数据的一个接口。有ArrayBuffer对象、TypedArr...

网友评论

      本文标题:二进制操作也十分有趣

      本文链接:https://www.haomeiwen.com/subject/qotdottx.html