zoukankan      html  css  js  c++  java
  • CSAPP(1):数字的计算机表示——课后题

    2.65

    int even_ones(unsigned x)

    要求:return 1 when x contains an even number of 1s; 0 otherwise. 假设int 有 w=32位。

    分析:最应该使用的是循环,但是循环语句不能使用。如果一个一个的写成语句,需要32次;这里使用二分法,那么操作就变成了Log232 =5次。二分法蕴含了循环同时简化了循环遍历。如何使用二分法?

      题目是判断x中1的奇偶数,可以将x一分为2,前16位x1与后16位x2,x3=x1^x2,则,如果x有偶数个1,x3必定有偶数个1;如果x有奇数个1,x3必定有奇数个。

    int even_ones(unsigned x)
    {
         x ^= (x >> 16);
         x ^= (x >> 8);
         x ^= (x >> 4);
         x ^= (x >> 2);
         x ^= (x >> 1);
         return !(x & 1);    
    }

    2.66

    int leftmost_one(unsigned x)

    要求: generate mask indicating leftmost 1 in x. assume w=32; if x=0, then return 0;

    提示:先将x转换成形如[0..011..1]的位向量

    分析:这里就是寻找最高位的1在位向量x中是第几位,应该使用循环,然后循环不能用,这里使用二分法。首先,如【提示】中,先将x转换成形如[0..011..1]的位向量,即:最高位1之后的所有位都变为1。

    int leftmost_one(unsigned x)
    {
         x |= x >> 1;
         x |= x >> 2;
         x |= x >> 4;
         x |= x >> 8;
         x |= x >> 16;
         x &= ~(x >> 1);
         return x;
    }
  • 相关阅读:
    vue(5)
    vue(4)
    vue(3)-防止闪烁
    vue(2)
    bootstrap 模态框
    2017年上半年工作总结和计划
    vue(1)
    文本框数量加减功能
    meta 控制移动端页面的缩放
    题解 P1550 【[USACO08OCT]打井Watering Hole】
  • 原文地址:https://www.cnblogs.com/wangyanphp/p/4825607.html
Copyright © 2011-2022 走看看