迷彩 潜伏 隐蔽 伪装
分类: LINUX
2013-02-18 17:10:04
今天在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, 随后的条件判断失败.