CSAPP Lab1--Manipulating Bits
2016-03-11 17:50
701 查看
实验材料:http://download.csdn.net/detail/u010560443/9458964
/* * bitNor - ~(x|y) using only ~ and & * Example: bitNor(0x6, 0x5) = 0xFFFFFFF8 * Legal ops: ~ & * Max ops: 8 * Rating: 1 */ int bitNor(int x, int y) { return (~x)&(~y); } /* * bitXor - x^y using only ~ and & * Example: bitXor(4, 5) = 1 * Legal ops: ~ & * Max ops: 14 * Rating: 2 */ int bitXor(int x, int y) { return (~(x&y)&~(~x&~y)); } /* * isNotEqual - return 0 if x == y, and 1 otherwise * Examples: isNotEqual(5,5) = 0, isNotEqual(4,5) = 1 * Legal ops: ! ~ & ^ | + << >> * Max ops: 6 * Rating: 2 */ int isNotEqual(int x, int y) { return (!!(x ^ y)); } /* * getByte - Extract byte n from word x * Bytes numbered from 0 (LSB) to 3 (MSB) * Examples: getByte(0x12345678,1) = 0x56 * Legal ops: ! ~ & ^ | + << >> * Max ops: 6 * Rating: 2 */ int getByte(int x, int n) { return (x>>(n<<3))&0xff; } /* * copyLSB - set all bits of result to least significant bit of x * Example: copyLSB(5) = 0xFFFFFFFF, copyLSB(6) = 0x00000000 * Legal ops: ! ~ & ^ | + << >> * Max ops: 5 * Rating: 2 */ int copyLSB(int x) { return x<<31>>31; } /* * logicalShift - shift x to the right by n, using a logical shift * Can assume that 1 <= n <= 31 * Examples: logicalShift(0x87654321,4) = 0x08765432 * Legal ops: ~ & ^ | + << >> * Max ops: 16 * Rating: 3 */ int logicalShift(int x, int n) { return (x>>n)&(~((1<<31)>>n<<1)); } /* * bitCount - returns count of number of 1's in word * Examples: bitCount(5) = 2, bitCount(7) = 3 * Legal ops: ! ~ & ^ | + << >> * Max ops: 40 * Rating: 4 */ int bitCount(int x) { //for every 4 bits, save the number of 1's into itself . //max number is 4 ,can be saved int mask,sum; mask=0x11|(0x11<<8); mask=mask|(mask<<16); sum=x&mask; sum+=(x>>1)&mask; sum+=(x>>2)&mask; sum+=(x>>3)&mask; //add high 16 bits into low 16 bits //max number is 8,can be saved by 4 bits mask=0xff|(0xff<<8); sum=(sum>>16)+(sum&mask); //for every 8 bits in low 16 bits,add high 4 bits into low 4 bits //max number is 16 ,can't be saved .so let it saved by 8 bits mask=0xf|(0xf<<8); sum=((sum>>4)&mask)+(sum&mask); //add high 8 bits into low 8 bits, mask=0xff; sum=(sum&mask)+(sum>>8); return sum; } /* * bang - Compute !x without using ! * Examples: bang(3) = 0, bang(0) = 1 * Legal ops: ~ & ^ | + << >> * Max ops: 12 * Rating: 4 */ int bang(int x) { //notice the sign bit of +0 and -0 are both 0 ,but others are not. int negx=~x+1; int x_sign=(x>>31)&0x1; int negx_sign=(negx>>31)&0x1; return (x_sign|negx_sign)^0x1; } /* * leastBitPos - return a mask that marks the position of the * least significant 1 bit. If x == 0, return 0 * Example: leastBitPos(96) = 0x20 * Legal ops: ! ~ & ^ | + << >> * Max ops: 6 * Rating: 4 */ int leastBitPos(int x) { //x and -x have the same least significant bit return x&(~x+1); } /* * TMax - return maximum two's complement integer * Legal ops: ! ~ & ^ | + << >> * Max ops: 4 * Rating: 1 */ int tmax(void) { return (1<<31>>31)^(1<<31); } /* * isNonNegative - return 1 if x >= 0, return 0 otherwise * Example: isNonNegative(-1) = 0. isNonNegative(0) = 1. * Legal ops: ! ~ & ^ | + << >> * Max ops: 6 * Rating: 3 */ int isNonNegative(int x) { return ((x>>31)&0x1)^0x1; } /* * isGreater - if x > y then return 1, else return 0 * Example: isGreater(4,5) = 0, isGreater(5,4) = 1 * Legal ops: ! ~ & ^ | + << >> * Max ops: 24 * Rating: 3 */ int isGreater(int x, int y) { //positive:0 , negtive: -1 int sign_x=x>>31; int sign_y=y>>31; //when sign is equal int equal=(!(sign_x^sign_y))&((~y+x)>>31); //when sign is not equal int notEqual=sign_x&!sign_y; return !(equal|notEqual); } /* * divpwr2 - Compute x/(2^n), for 0 <= n <= 30 * Round toward zero * Examples: divpwr2(15,1) = 7, divpwr2(-33,4) = -2 * Legal ops: ! ~ & ^ | + << >> * Max ops: 15 * Rating: 2 */ int divpwr2(int x, int n) { //mask = (2^n)-1 int mask = (1 << n) + ~0; //positive: equalizer=0 ; negtive: equalizer=(2^n)-1 int equalizer = (x >> 31) & mask; //negtive need add (2^n)-1 return (x+equalizer)>>n; } /* * abs - absolute value of x (except returns TMin for TMin) * Example: abs(-1) = 1. * Legal ops: ! ~ & ^ | + << >> * Max ops: 10 * Rating: 4 */ int abs(int x) { //positive:0 , negtive: -1 int mask=x>>31; //if x<0,res=~x ;else if x>=0, res=x; int res=mask^x; ////if x<0,addition=1 ;else if x>=0, res=0; int addition=(x>>31)&0x1; return res+addition; } /* * addOK - Determine if can compute x+y without overflow * Example: addOK(0x80000000,0x80000000) = 0, * addOK(0x80000000,0x70000000) = 1, * Legal ops: ! ~ & ^ | + << >> * Max ops: 20 * Rating: 3 */ int addOK(int x, int y) { //calulate the sign of x,y and sum int sum=x+y; int signx=(x>>31)&0x1; int signy=(y>>31)&0x1; int signsum=(sum>>31)&0x1; //overflow when signx=0 and signy=0 but signsum=1 , //overflow when signx=1 and signy=1 but signsum=0 int result=!!((signx^signy)+!(signx^signsum)+!(signy^signsum)); return result; }
相关文章推荐
- Android 镜像地址[持续更新中]
- Android初试--请求码和结果码
- 关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题
- iOS 页面自动布局-NSLayoutConstraint简介
- iOS判断当前时间是否处于某个时间段内
- Android基础知识之控件系列(1)——TextView及自定义动态TextView
- IOS开发中新特性的实现
- iOS之旅--用CollectionView实现轮播图效果+封装方法
- 解决Android Activity切换时出现白屏问题
- ios------进度轮
- 图例阐述栈堆常量池之间的关系
- mac unity3d api获取不到问题
- cocos2d-x3.10java.lang.UnsatisfiedLinkError: Couldn't load cocos2djs from loader dalvik.system.Path
- Android数据库Sqlite完全解析
- 初学Android Wi-Fi Peer-to-Peer
- android 布局文件里输入框的值自动转换到类里边,可以增加为空验证
- iOS判断是模拟器还是真机
- appium环境搭建步骤记录(二)-appium环境配置及sdkmanager
- android使用Zxing库实现二维码的生成
- cannot be cast to android.support.v4.app.Fragment