最近看csapp,发现还有实验可以做,个人觉得还是挺有意思的。写个日记记录下自己实验过程。
代码+注释(防止以后看不懂)
1-bitXor(x,y):只使用"~"和"&"运算来实现 x ^ y;
int bitXor(int x, int y){
return (~(x & y)) & ~(~x & ~y);
}
注释:"^"可使用"~"和"|"来运算。x = 3 = 0011,y = 5 = 0101。x ^ y = 0110
>(~x | ~y) & (x | y) ==> (1100 | 1010) & (0011 | 0101) ==> 1110 & 0111 ==> 0110
>将"|"替换为"&"
>1:'1110':用"&"运算可以用'(x & y)'来得到'0001'后将其置反为'1110' =='~(x & y)'
>2:'0111':将其置反后得出'1000',发现与上方的'(x & y)'相反。
所以将'x和y'置反'(~x & ~y)'得到'1000'置反为'0111' == '~(~x & ~y)'
>3:'1110 & 0111'剔除不同位 == '0110'
2-tmin():返回最小补码
Tmin = 0x10000000
int tmin(){
return 1 << 31;
}
3-isTmax(int x):当补码数x为Tmax时返回1,否则返回0
-1 = 0xFFFFFFFF
Tmax = 0x7FFFFFFF。
限定指令 | 指令数 |
---|---|
! ~ & ^ | + | 10 |
//第一次想出的解法:
//!(((x + 1) ^ x) + 1)
/*题解:当 x == Tmax 时,x + 1 = Tmin。
Tmax ^ Tmin = -1,-1 + 1 = 0。而题目要求返回1,所以加个逻辑非,!0 = 1。*/
//但是当x == -1时,该解法出错。
/*if x == -1:-1 + 1 = 0,0 ^ x = x,x + 1 = 0。将其逻辑非后为1*/
//修改:将 x + 1中的1改为一个变量mask,当x == -1 时 mask = 0,其他情况为1
/* mask = !!(~x)。if x == -1:~(-1) = 0,!!0 = 0*/
-----int isTmax(int x){
---------return !(((x + !!(~x)) ^ x) + 1);
}
4-allOddBits(int x):x所有奇数位为1时返回1,否则返回0.
限定指令 | 指令数 |
---|---|
! ~ & ^ | + << >> | 12 |
/*
*****0为最低奇数位,31为最高奇数位*/
-----int allOddBits(int x){
---------int lops = (0xaa << 8) + 0xaa;
---------int mask = (lops << 16) + lops;
/*创建所有奇数位为1的掩码 mask = 0xaaaaaaaa*/
--------- return !((x & mask) ^ mask);
}
/*当x = 0xffffffff 或 x = 0xaaaaaaaa时
*********x & mask ^ mask时产生0*/
5-negate(int x):不使用'-'号来实现负数
限定指令 | 指令数 |
---|---|
! ~ & ^ | + << >> | 5 |
-----int negate(int x) {
/*0占用一位,所以需要加上1*/
---------return (~x + 1);
}