zoukankan      html  css  js  c++  java
  • 【C语言】练习2-9

    •  题目来源:《The C programming language》中的习题P38
    •  练习2-9:  在求对二的补码时,表达式x &= (x-1)可以删除x中最右边值为1的一个二进制位。请解释这样做的道理。用这一方法重写下面的bitcount函数,以加快其执行速度。
    #include<stdio.h>
    
    void main(){
        unsigned x = 0645;     // 110_100_101
        int a = bitcount(x);
        printf("%d
    ",a);
    }
    
    /*bitcount:获得x(二进制)中1的个数*/
    int bitcount(unsigned x){
        int b = 0;
        for(;x != 0; x >>= 1){
            if(x & 1){
                b++;
            }
        }
        return b;
    }

      解题思路:对于x的二进制形式,分为两种:最右边二进制位为0和最右边二进制位为1 

    1. 如果x的形式如XXX1, 那么x & (x-1)应该为 XXX0 & XXX1 = XXX0。 例如: 110_100_101 & 110_100_100 = 110_100_100。最右边的1被删除。
    2. 如果x的形式如XX10..00, 那么x & (x-1)应该为 XX01..11 & XX10..00 = XX00..00例如: 110_100_100 & 110_100_011 = 110_100_000。最右边的1被删除。

      代码实现:

    #include <stdio.h>
    void main()
    {
         unsigned x = 0645;     // 110_100_101
         int count = 0;
         while (x != 0) {
              x &= (x-1);
              count++;
         }
         printf("1-bit count: %d
    ", count);
    }

      参考资料:http://blog.csdn.net/dc_726/article/details/7032656

  • 相关阅读:
    ecshop 整合 kindedotor
    css 一些小笔记
    linux 使用 随记录
    GIPZ 压缩
    js 代码 随记
    map和list循环遍历
    向数据库批量处理事件
    链表和数组的优劣比较
    内存对齐 和 sizeof小结
    C++的默认构造函数与构造函数
  • 原文地址:https://www.cnblogs.com/ningvsban/p/3781210.html
Copyright © 2011-2022 走看看