anyOddBit
题目要求:return 1 if any odd-numbered bit in word set to 1
例如: anyOddBit(0x5) = 0, anyOddBit(0x7) = 1
允许操作:! ~ & ^ | + << >>
操作数限制:12
题目解析:解析以32位为主,想要判断一个二进制数,是否只有奇数位有值,我们只需要将它与0xaaaaaaaa进行位与(&)操作。
我们来复习一下位运算的几个操作,便能理解我们为何需要这样做.
-
按位与(&):口诀“有一个0则是0” 或 “两个1才是1”。
-
按位或(|):口诀“有一个1则是1”或“两个0才是0”。
-
按位异或(^):口诀“不同为1,相同为0”。
-
左移:
1.逻辑左移:左移同时前面补0
2.算术左移:左移同时前面补符号位 -
右移:
逻辑右移(算术右移):右移的同时后面补0
思考:对于一个w位的数据,如果移动的位数k>=w。
其实,实际上位移量就是通过 k mod w 得到的。
好了言归正传,我们来解释为何只要将数据与0xaaaaaaaa就能解决这个问题,a的二进制位1010,正好是偶数位有值,如果我们给的参数只有奇数位有值,由于位与运算得结果为0,一旦偶数位上有值,由位与运算,结果的偶数位一定会有值。
代码如下:
#include <stdio.h>
#include <stdlib.h>
int anyOddBit(int x){
return (x&0xaaaaaaaa);
}
int main(){
int x,ret;
scanf("%d",&x);
ret=anyOddBit(x);
if(ret) printf("Even Bits Have Values");
else printf("Only Odd Bits Have Values");
return 0;
}
运行实例:
这个实验还是比较简单的,检验的是我们对按位与的理解。CSAPP中的基础位运算一定要熟练掌握,在今后的实验中大有用处,我们平时的基本操作如“>” “<” "=="等比较操作都可以用位运算写出其函数。
所以不好好复习基础,也是無駄無駄無駄無駄!