p_154

//5x/8
define MSB_BIT (~(~0U >> )) int mul5div8(int val)
{
int sign = (val & MSB_BIT) == MSB_BIT; //取符号位
int bias = ( + !sign) & ; int q = val >> ;
int r = val - (q << );
r = (r << ) + r + bias >> ; //向零取整
q = (q << ) + q + r; return q;
}
//整数绝对值
unsigned int abs(int val)
{
int temp = val >> ;
return (val ^ temp) - temp;
} unsigned int abs(unsigned val)
{
  unsigned int sign = val >> 31;
   return (val ^ (0 - sign)) + sign;
}
对于X86与mips,上一指令更少
对于ARM,下一指令更少
//将字节的最高位视为符号位,向左扩展
unsigned int extbyte_leftmost_one(unsigned char val)
{
unsigned temp = val;
return ((temp + 0X80) & 0XFF) - 0X80;
}
//是否含有偶数个1
unsigned int even_ones(unsigned int val)
{
val ^= val >> ;
val ^= val >> ;
val ^= val >> ;
val ^= val >> ;
val ^= val >> ; return !(x & );
}
//最右侧的1置为0
unsigned int clc_rightmost_one(unsigned int val)
{
return val & (val - );
}
//最右侧的连续1置0
unsigned int clc_rightmost_one_group(unsigned int val)
{
return (val | val - ) + & val;
}
//向零取整,除2的幂次
int divide_power2(int x, int k)
{
//注意下:对于移位运算,即使移位个数的类型为无符号类型,也不会将被移位数当成无符号类型进行移位,而是保持被移位数原来的类型属性
int bias = ( (x >> ((sizeof(int) << ) - )) & ((( << k) << ) - ) ) >> k;
return (x + bias) >> k;
}
//找到最左侧的1
unsigned int leftmost_one(unsigned int val)
{
val |= val >> ;
val |= val >> ;
val |= val >> ;
val |= val >> ;
val |= val >> ; return val - (val >> );
}
//找到最右侧的1
unsigned int rightmost_one(unsigned int x)
{
return x & (-x);
}
//找到最右侧的0
unsigned int rightmost_zero(unsigned int val)
{
return (~val) & (val + );
}
//据最右侧的1及后边的0生成掩码
unsigned int mask_rightmost_one_withzero(unsigned val)
{
return val ^ (val - );
}
//据右侧的连续的0生成掩码
unsigned int mask_rightmost_zero_group(unsigned int val)
{
return (~val) & (val - );
}
//向右传播最右侧的1
unsigned int propagate_rightmost_one(unsigned int val)
{
return val | (val - );
}

CSAPP chapter2 记录(bit_level_coding)的更多相关文章

  1. CSAPP buffer lab记录——IA32版本

    CSAPP buffer lab为深入理解计算机系统(原书第二版)的配套的缓冲区溢出实验,该实验要求利用缓冲区溢出的原理解决5个难度递增的问题,分别为smoke(level 0).fizz(level ...

  2. CSAPP Bomb Lab记录

    记录关于CSAPP 二进制炸弹实验过程 (CSAPP配套教学网站Bomb Lab自学版本,实验地址:http://csapp.cs.cmu.edu/2e/labs.html) (个人体验:对x86汇编 ...

  3. CSAPP:datalab实验记录

    CSAPP:datalab实验记录 bitXor /* * bitXor - x^y using only ~ and & * Example: bitXor(4, 5) = 1 * Lega ...

  4. 链接器(linker)的作用——CSAPP第7章读书笔记

    首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:“Process is fundamentally ...

  5. CSAPP:cachelab(1)

    本项目大体上就是要求用C\C++来模拟cpu对cache的访问,然后统计hits.misses和eviction的次数.其实并没有想象中的那么难,感觉完全可以当成一道acm里面的大模拟题..下面就对这 ...

  6. [CSAPP笔记][第九章虚拟存储器][吐血1500行]

    9.虚拟存储器 为了更加有效地管理存储器且少出错,现代系统提供了对主存的抽象概念,叫做虚拟存储器(VM). 虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完美交互. 为每个进程提供一个 ...

  7. CSAPP 六个重要的实验 lab5

    CSAPP  && lab5 实验指导书: http://download.csdn.net/detail/u011368821/7951657 实验材料: http://downlo ...

  8. CSAPP HITICS 大作业 hello's P2P by zsz

    摘 要 摘要是论文内容的高度概括,应具有独立性和自含性,即不阅读论文的全文,就能获得必要的信息.摘要应包括本论文的目的.主要内容.方法.成果及其理论与实际意义.摘要中不宜使用公式.结构式.图表和非公知 ...

  9. 《Linux内核设计与实现》学习记录一

    chapter1 Linux内核简介 前言:Unix是一个具有相似应用程序编程接口(API)并且基于相似设计理念的操作系统家族. 1.1 Unix的历史 1.Unix演化版实现了任务管理.换页机制.T ...

随机推荐

  1. 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))

    需求说明:深度学习FPGA实现知识储备 来自:http://blog.csdn.net/stdcoutzyx/article/details/41596663 说明:图文并茂,言简意赅. 自今年七月份 ...

  2. 【Android】3.2 基本地图功能

    分类:C#.Android: 日期:2016-02-04 3.2 示例2--基本地图功能 一.简介 1.地图 地图展示:普通地图(2D,3D).卫星图和实时交通图. 地图操作:可通过接口或手势控制来实 ...

  3. 【Android】8.3 自定义主题

    分类:C#.Android.VS2015: 创建日期:2016-02-17 一.简介 在Android系统中,除了内置的主题外,开发人员还可以自定义主题.一般通过在Resources/value文件夹 ...

  4. 李洪强iOS开发之FMDB线程安全的用法

    // //  ViewController.m //  04 - FMDB线程安全的用法 // //  Created by 李洪强 on 2017/6/6. //  Copyright © 2017 ...

  5. 某人在企业中遇到的Spark问题记录[持续更新]

    https://github.com/ssg-7max/ssg 目前 ssg内公司内部 spark streaming 处理数据源是kafka 目前遇到最大的问题是,会延迟,例如我们配置1分钟让窗口计 ...

  6. Markdown 11种基本语法【转】

    [转自:http://www.cnblogs.com/hnrainll/p/3514637.html] 1. 标题设置(让字体变大,和word的标题意思一样)在Markdown当中设置标题,有两种方式 ...

  7. Windows下 Pycharm连接Github 教程

    Pycharm连接Github 绑定账号 1.File->Settings->Version Control->Github Settings.png 会出现github,然后在旁边 ...

  8. c++重载前置++和--

    C语言中,前置和后置++,--都不能作为左值,而在c++中,前置的++和--可以作为左值,从下面的重载运算符中也可以看出,它们返回的是引用,我不知道为什么这里和c语言中不同,但c++类似的提升还有三目 ...

  9. Head First 设计模式读书笔记(1)-策略模式

    一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...

  10. jQuery或者js保存文件到本地

    一: // 浏览文件夹(指定文件路径) function BrowseFolder() { try { var Message = "Please select the folder pat ...