快速按位比较

Nie*_*sol 5 language-agnostic math bitwise-operators

我有两个字节,由两个打包在一起的4位数字组成.我需要知道第一个字节中的两个数字中的任何一个是否匹配第二个字节中的任何一个数字.零被视为空,不应与自身匹配.

显然,我可以通过打开数字并逐个比较它来做到这一点:

a = 0b10100101;
b = 0b01011111; // should have a match because 0101 is in both

a1 = a>>4; a2 = a&15;
b1 = b>>4; b2 = b&15;

return (a1 != 0 && (a1 == b1 || a1 == b2)) || (a2 != 0 && (a2 == b1 || a2 == b2));

//     ( true   && (  false  ||   false )) || ( true   && (  true   ||   false ))
//     ( true   &&         false         ) || ( true   &&         true          )
//            false                        ||         true
//                                        TRUE
Run Code Online (Sandbox Code Playgroud)

但是我只是想知道是否有人知道更清洁的方法吗?

pax*_*blo 0

一种更简洁的方法是摆脱难以解析的表达式并使代码更具可读性。

def sameNybble (a, b):
    # Get high and low nybbles.

    ahi = (a >> 4) & 15 ; alo = a & 15;
    bhi = (b >> 4) & 15 ; blo = b & 15;

    # Only check ahi if non-zero, then check against bhi/blo

    if ahi != 0:
        if ahi == bhi or ahi == blo:
            return true

    # Only check alo if non-zero, then check against bhi/blo

    if alo != 0:
        if alo == bhi or alo == blo:
            return true

    # No match

    return false
Run Code Online (Sandbox Code Playgroud)

任何像样的优化编译器基本上都会为您提供相同的底层代码,因此有时最好针对可读性进行优化。