csapp lab1

文章包含一系列编程题目,涉及位操作,如异或仅用~和&实现,判断二进制最小值,检测补码最大值,检查奇数位是否全为1,计算相反数以及条件选择。每个问题的解决方案都基于位运算,如非、与、异或、移位等操作,并给出相应的运算表达式。
摘要由CSDN通过智能技术生成


第一题:
/* 
 * bitXor - x^y using only ~ and & 
 *   Example: bitXor(4, 5) = 1
 *   Legal ops: ~ &
 *   Max ops: 14
 *   Rating: 1
 */
题目的意思是只能使用~(非)和与(&)实现异或(^)
x & y = 1 (11)
x & y = 0(01,10,00)

对于x,y,只能有两种&组合,x&y和~x & ~y,如果是 ~x&y,或者是 ~y&x,都是行不通,要么都取反,要么都不取,多次尝试 ~(x & y)&~(~x&~y)可以实现异或

第二题:

/2
/*
 * isTmax - returns 1 if x is the maximum, two's complement number,
 *     and 0 otherwise 
 *   Legal ops: ! ~ & ^ | +
 *   Max ops: 10
 *   Rating: 1
 */意思是输出2进制的最小值

2进制最高位1为负数,0为正数。这里需要用到移位运算符,左移1位相当于乘以2

 根据这张图很容易得到32位的2进制最小值为100.....00(共31个0)用移位运算符表示为1<<31

第三题:

* isTmax - returns 1 if x is the maximum, two's complement number,
 *     and 0 otherwise *   Legal ops: ! ~ & ^ | +
 *   Max ops: 10
 *   Rating: 1
 */
int isTmax(int x) {
  return 2;

这道题目要求实现一个函数isTMax,该函数作用是判断输入的整数是否为补码(计算机中用来表示负数的一种编码方式)最大值,如果是补码最大值返回1,如果x不是补码最大值,则返回0。

可以通过对x取相反数来判断这个整数是否为补码最大值(在补码表示中,一个数的相反数等于它按位取反再加一)如果是最大补码数01111111(假设是8位2进制的数),它按位取反再加一(只有最低位相同),再与它本身进行异或(相同为0,不同为1)所以结果应该为11111110再取反为00000001(即为1)表示x为最大补码数

用运算符表示为!(x^(~x+1))

第四题:


 * allOddBits - return 1 if all odd-numbered bits in word set to 1
 *   where bits are numbered from 0 (least significant) to 31 (most significant)
 *   Examples allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 12
 *   Rating: 2
 */
这是一个用于检查一个32位有符号整数的奇数位是否全为1的C语言函数,需要符合以下需求:输入一个32位整数如果x的奇数位均为1则返回1,否则返回0.可以使用 ! ~ & ^ | + << >>这些运算符,最多使用12个运算符。

首先想到32位有符号整数的奇数位全为1的数假设它是y=0xAAAAAAAA,让y与x先进行&运算(两个都为1结果才为1)如果x是奇数位全为1那么&运算后所有的奇数位仍然全部为1,(偶数位不管是0还是1&运算之后全都为0),再进行^运算(相当于与y本身进行异或)结果为0,因为题目要返回1所以最后的结果是~((x&y)^y)

第五题:

 negate - return -x 
 *   Example: negate(1) = -1.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 5
 *   Rating: 2
 */
int negate(int x) {
  return 2;
}

该函数的作用是计算一个32位有符号数的相反数

2进制的相反数取反加一

所以是~x+1

第六题

 
 * isAsciiDigit - return 1 if 0x30 <= x <= 0x39 (ASCII codes for characters '0' to '9')
 *   Example: isAsciiDigit(0x35) = 1.
 *            isAsciiDigit(0x3a) = 0.
 *            isAsciiDigit(0x05) = 0.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 15
 *   Rating: 3
 */

这道题的意思是如果x在大于等于0x30且小于等于0x39就返回1,否则返回0,这里需要判断。

这个题x需满足:0x30=<x=<0x39,我们将它拆分为,0x30=<x并且x=<0x39

x-0x30>=0------>(x+~0x30)=a

0x39-x>=0------>(0x39+~x)=b

然后只需要判断符号位,当a,b均大于等于0时,a和b的符号位一定为0。所以我们分别将a,b右移31位,当a,b均为0时,判断为真。

结果为!((x + ~0x30)>>31) | ((0x39 + ~x)>>31))

第七题

* conditional - same as x ? y : z 
 *   Example: conditional(2,4,5) = 4
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 16
 *   Rating: 3
 */

最后要进行一个或运算,x要返回一个值,当x为真时可以得到y的值此时z值要等于0;当x为假时,y会变为0,而得到z的值。最后变为0的操作我们需要用到&,和0x0000 0000进行与运算,则任何数都会返回为0。就是说到最后时x变为0xFFFF FFFFF,0x0000 0000分别和y,z进行&运算。看题目给的例子,当x为2时,返回4(y)。所以当x为非0数时返回y,则当x为0时返回z

结果是(x & y) | (~x & z)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值