Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7173008
  • 博文数量: 3857
  • 博客积分: 6409
  • 博客等级: 准将
  • 技术积分: 15948
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-02 16:48
个人简介

迷彩 潜伏 隐蔽 伪装

文章分类

全部博文(3857)

文章存档

2017年(5)

2016年(63)

2015年(927)

2014年(677)

2013年(807)

2012年(1241)

2011年(67)

2010年(7)

2009年(36)

2008年(28)

分类: LINUX

2013-02-18 17:10:04

原文地址:有趣的位操运算 作者:zooyo

今天在CU看到一个帖子有点意思,对几位高手的代码做个简单的分析,加深理解.



有4个无符号整数,存储在四个变量里
uint64_t rax;
uint64_t rdx;
uint64_t r8;
uint64_t r9;

现在需要计算如下条件表达式的结果:
(rax == 1) && (rdx == 0) && (r8 == 0) && (r9 == 0)

我是这么设计的
uint64_t rsi = 0;
if (rax != 1) rsi = 1;
if (rdx != 0) rsi = 1;
if (r8 != 0) rsi = 1;
if (r9 != 0) rsi = 1;

rsi就是保存的计算结果, 结果是0, 条件为真,非零为假.

还有没有更高效的算法?


这里是大家最容易也是最易懂的写法, if里逻辑判断, 或者逐个判断用一个变量保存结果.



rsi = 0;
rsi |= r9;
rsi |= r8;
rsi |= rdx;
if (rsi == 0) {
    if (rax == 1) 条件成立;
}
这样效率要高一些, rsi和后三个变量逐个位或运算, 因为或运算两个位都是0, 结果才为0, 否则为1, 只要这三个数有一个是非零值, 那么rsi必然为非零值, 后面的条件判断就判断rsi的结果, 再判断第一个变量是否为1.




rsi = (rax ^ 0x1) | (rdx | r8 | r9)


这句代码看起来更简单, 因为按题目要求ris保存结果为0, 条件为真, 那么这里首先把第一个变量rax与1进行异或运算, 两位不同结果为1, 两位相同结果为0, 当rax为1时, rax ^ 0x1结果为0, 再跟后面的位运算判断结果, 当然我们希望后面的位运算结果是0, 这样 0 | 0 的结果是0, 复制给rsi, 得到我们预期的结果, 否则后面的rdx | r8 | r9运算只要有一个非零值, 其结果为1, 那么 0 | 1 的结果为1, 随后的条件判断失败.

阅读(517) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~