代码之家  ›  专栏  ›  技术社区  ›  Jon V

检查字节是0x00还是0xFF的算法

  •  1
  • Jon V  · 技术社区  · 13 年前

    是否有逻辑等价物:

    if(byte != 0x00 || byte != 0xFF)

    if(byte != 0x00 && byte != 0xFF)
    

    我已达到程序内存限制,可以使用所有优化:)

    为了用文字解释,你能用逻辑函数检查所有比特是否相同(所以都是0还是都是1)吗?

    谢谢

    4 回复  |  直到 13 年前
        1
  •  6
  •   Steve Jessop    13 年前

    假设 byte 具有无符号的8位类型[Edit:并且假设您的意思是 && || ],您可以尝试:

    !((uint8_t)(byte+1) <= 1)
    

    显然,这是否会产生更小的代码是不可能的,你只需要试试看。毫无疑问,其他人可以想出其他逻辑上等价的表达方式。

    你也可以看看你的编译器产生了什么,如果你怀疑你的编译器的优化不是很好,看看其他更好的编译器产生什么。这可能会给你提供其他在逻辑上等价的表达式的想法。

        2
  •  6
  •   Kerrek SB    13 年前

    大概 (unsigned char)(byte + 1) > 1 ?假设你的意思是 && 当然并且假设 CHAR_BIT == 8 ,如果您希望“所有位集”表示 0xFF

        3
  •  2
  •   Alexey Frunze    13 年前

    条件总是成立的。

    我严重怀疑上述检查是否能得到充分的落实。

    在指令级别,if看起来像:

    ; if(byte != 0x00 || byte != 0xFF) 
    cmp byte, 0
    jnz ifbody
    cmp byte, 0xFF
    jz skipifbody
    ifbody:
    ;{
    ; if body
    ;}
    skipifbody:
    

    这里大约有4条说明。这里没有太多需要优化的地方。

    我会在代码中寻找其他地方来优化大小。首先要看的是数据,而不是代码。

        4
  •  2
  •   szx    13 年前

    我发现,给定您的原始代码,GCC足够聪明,可以在使用时生成类似于Kerrek SB的答案 -O2 以下为:

    movzbl  8(%ebp), %eax
    subl    $1, %eax
    cmpb    $-3, %al
    setbe   %al
    

    其基本上等同于:

    ((unsigned char)byte - 1) <= -3 // or 0xFD