计算奇偶性,二进制数奇偶校验

参照《深入理解计算机系统(原书第三版)》习题3.26

long fun_a(unsigned long x)
{
    long val = 0;
    while (x){
        val ^= x;
        x >>= 1;
    }
    return val & 0x1;
}

如果x中有奇数个1就返回1,偶数个1就返回0。
右移操作会在最高位补零。
该算法的本质是将x的最后一位(红框)与向前到最高位的1为止的所有数(绿框)逐个做异或操作。
在这里插入图片描述
由于异或运算满足交换律和结合律,所以该操作等于将x从最高位1向后的所有数都做异或

val = 1 ^ 1 ^ 1 ^ 0 ^ 1;

汇编代码

fun_a(unsigned long):
		; x in %rdi
        xorl    %eax, %eax    ;置零
        testq   %rdi, %rdi
        je      .L4
.L3:
        xorq    %rdi, %rax
        shrq    %rdi
        jne     .L3
        andl    $1, %eax
        ret
.L4:
        ret
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值