CSAPP实验日志——判断是否整数的二进制表示是否只有奇数位有值

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中的基础位运算一定要熟练掌握,在今后的实验中大有用处,我们平时的基本操作如“>” “<” "=="等比较操作都可以用位运算写出其函数。

所以不好好复习基础,也是無駄無駄無駄無駄!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值