datalab实验

  1. bitXor
    首先分析题目:意思为x与y异或运算,只能使用~(非运算),&(与运算)
    x,y异或表示为x⊕y
    运算法则为x⊕y = (¬x ∧ y) ∨ (x ∧¬y)
    ¬:可以理解为~(非运算)
    ∧:可以理解为&(与运算)
    ∨:可以理解为 | (或运算)
    这个题目只允许使用~,&,需要把 | 转化为~,&
    (¬x ∧ y) ∨ (x ∧¬y)<==> ¬((¬(¬x ∧ y) )∨¬(x ∧¬y)))
    然后用德·摩根定律
    在这里插入图片描述

得到最后的结果¬ ((¬(¬x ∧ y) )∧¬ (¬(x ∧¬y)))
最后整理得到(((~x&y))& ((x&y)))

  1. tmin
    首先分析题目:意思为返回2进制的最小值
    可以使用! ~ & ^ | + << >>
    2进制最小值为-128,也就是1000 0000 0000 0000
    要得到结果需要第一位为1,例如 0000 0000 0000 0001
    将1左移31位就可以得到1000 0000 0000 0000
    还有像1,3,5这样的都可以左移31位得到结果
    int a=5;
    return a<<31;

  2. isTmax
    首先分析题目:如果x是2进制补码最大值则返回1,否则返回0
    可以使用! ~ & ^ | +
    ! 表示逻辑非,是逻辑运算符,运算对象是真或假。
    若表示a不等于0,就写成!a=0,假设a=1,则!a=0;假设a=0,则!a=1
    根据题目可以得到x为2进制最大值也就是127,二进制补码为
    0111 1111 1111 1111
    想要得到结果需要将x转化为0,得到相反的结果,然后 ! 就可以
    得到最后的结果
    如果将最大值和最小值相加,然后再取反就可以得到0
    定义a=x+1;则a为最小值,即1000 0000 0000 0000
    然后x=x+a;得到0xFFFFFFFF,即1111 1111 1111 1111
    再将x=~x;得到全零,即0000 0000 0000 0000
    然后!就得到 0000 0000 0000 0001
    但是0xFFFFFFFF也是一种特殊情况,它本身就是全一的情况,它加1也可以得到全零,需要将这种情况排除,
    可以将a取反,一个非零的布尔值都是ture,也就是1;
    然后再x=x+a,x要么加0,要么加1
    在这里插入图片描述
    得到最后结果

4.allOddBits
首先分析题目:意思判断奇数位上的数字都为1,则返回1,否则为0
可以使用! ~ & ^ | + << >>
题目已经提示我们0xAAAAAAAA返回1;
0xAAAAAAAA也就是1010 1010 1010 1010 1010 1010 1010 1010
让x与0xAAAAAAAA判断比较
需要先得到0xAAAAAAAA;
可以定义a=0xAA;
然后将a左移24位,左移16位,左移8位,再加上a本身就可以得到
AA 0000 0000 1010 1010
AA<<8 1010 1010 0000 0000
AA<<16 1010 1010 0000 0000 0000 0000
AA<<24 1010 1010 0000 0000 0000 0000 0000 0000
然后让赋值给a,即a=0xAAAAAAAA
如果x奇数位上都为1
则x为1010 1010 1010 1010 1010 1010 1010 1010

5.negate
首先分析题目:返回-x;
可以使用! ~ & ^ | + << >>
题目中的例题,1返回-1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值