好文档 - 专业文书写作范文服务资料分享网站

计算机整数编码实验

天下 分享 时间: 加入收藏 我要投稿 点赞

计算机编码实验

总体限制,只能使用!,~单目运算符以及&,^,|,+,<<,>>双目运算符,禁止使用任何控制结构,禁止使用任何函数和宏,禁止使用任何形式的类型转换。 实验1:

编写int bitAnd(int x, int y)函数 只用~或者|实现x&y,并将结果返回。

实现方法:AND运算是两个为1,值为1,OR运算是有一个为1,值就为1,因此,将两个数取反,然后再做或运算,最后再取反就可以得到AND运算同样的效果。 实验代码:

int bitAnd(int x, int y) {

int ret; x = ~x; y = ~y; ret = x|y; ret = ~ret; return ret; } 实验2:

编写函数int getByte(int x, int n),取出x中的n号字节,并将结果返回。编号从低位到高位,并且从0开始算起,使用操作符的数量最多是6个。

实现方法:每字节占用8Bits,因此要取n号字节只需要将数值右移8*nBits,就可以,此外乘8操作相当于将n左移动3位。 实验代码:

int getByte(int x, int n) {

n = n << 3; x = x>>n; return x&0xFF; } 实验3:

编写函数int logicalShift(int x, int n)将x逻辑右移n位(0<=n<=31),并将结果返回。限定只能使用20个操作符号。 实现方法:算术右移,是用符号位填补高位,逻辑右移是用0填补高位。逻辑右移和算术右移,在C语言层,所用的运算符号都是”>>”。C编译器通过整数是有符号整数还是无符号整数来分别编译成算术右移和逻辑右移指令。 实验代码:

int logicalShift(int x, int n) {

unsigned int tmp = x; tmp = tmp>>n; return tmp; } 实验4:

编写函数int bitCount(int x),统计x的二进制表示中1的数量,并将结果返回。要求不能使用if do while for switch等任何控制结构,只能使用单目运算符:!、~双目运算符&、^、|、+、<<、>>。 实现方法:

给定一个整数,统计其二进制数位中1的个数,例如 5 的二进制数位中1的个数是 2。

题目测试二进制数位的表示,假设整数为32位整型数,可以采取分治算法来处理,问题可以变成32位整型数数位中包含1的数位的个数,采用分治思想,变成高16位整型数数位中的包含1的数位的个数和低16位整型数数位中包含1的数位的个数,然后再变成4个8位整型数的数位中包含1的数位的个数,...,依次类推,变成1位整型数中包含1的数位的个数。然后我们可以根据1位整型数中包含1的数位的个数,逆序得到32位整型数数据中包含1的个数。诚然1位数包含1的数位的个数就是该1位数的数值,两个1位数相加得到一个2位数包含1的数位的个数,依次向上,计算出32位数包含的1的数位的个数。

通过一个例子来验证上述说法,我们假设d是一个32位的整型数,

其值是171H,其二进制表示是:101110001B, 数位1 数位2 数位4 数位8 171H(1,0111,0001B) 运算 171H(1,0111,0001B) d=171H 161H(1,0110,0001B) d=(d&0x55555555)+((d>>1)&0x55555555) 131H(1,0011,0001B) 104H(1,0000,0100B) d=(d&0x33333333)+((d>>2)&0x33333333) d=(d&0xffffffff)+((d>>4)&0xffffffff) d=(d&0x00ff00ff)+((d>>8)&0x00ff00ff) d=(d&0x0000ffff)+((d>>16)&0x0000ffff) 数位16 5H(0101B) 数位32 5H(0101B) 实验代码: 将其转换成程序如下: int bitCount(int x) {

unsigned int d = x; printf(\

d = (d&0x55555555)+((d>>1)&0x55555555); printf(\

d = (d&0x33333333)+((d>>2)&0x33333333); printf(\

d = (d&0x0F0F0F0F)+((d>>4)&0x0F0F0F0F); printf(\

d = (d&0x00FF00FF)+((d>>8)&0x00FF00FF); printf(\

d = (d&0x0000FFFF)+((d>>16)&0x0000FFFF); printf(\ return d; }

需要注意的是,针对移位操作对有符号数和无符号数的差别,对有符号数来说,>>是将符号位插入到最左位,对于无符号来说,>>是在最左位补零。 实验5:

编写函数int bang(int x),不使用!实现!操作符,并将结果返回,只是用操作符号~,&,^.|,+,<<,>>。要求只能使用操作符:~,&,^,|,+,<<,>>,不能使用if do while for switch 等任何控制结构;并且操作符的使用数量限制为12个 实现方法:

所能使用的运算符中,能实现取反的只有~,而~是按位取反,可以通过将给定整数的所有位1的数位进行汇总,汇总到最后一位上,之后通过取反来得到结果。

假定给定的整数是32位的,并假定它为x,通过x=x|(x>>16)运算先将高16位汇总到低16位上;之后在通过x=x|(x>>8),将为1的数位汇总到低8位上,按照上述方法,最后将为1的数位汇总到Bit0上。然后~x&1就是需要的结果。 代码表示如下: Int bang(int x)

计算机整数编码实验

计算机编码实验总体限制,只能使用!,~单目运算符以及&,^,|,+,<>双目运算符,禁止使用任何控制结构,禁止使用任何函数和宏,禁止使用任何形式的类型转换。实验1:编写intbitAnd(intx,inty)函数只用~或者|实现x&y,并将结果返回。实现方法:AND运算是两个为1,值为1,OR运算是有一个为1,值就为1,因此,
推荐度:
点击下载文档文档为doc格式
5tr6s208a28qp2012imx4yj364q360011mt
领取福利

微信扫码领取福利

微信扫码分享