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

时间:2012-09-14 12:42:04

标签: c boolean-logic

是否有逻辑等同于:

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

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

我处于程序内存限制并且可以使用每个优化:)

用单词解释,如果所有位都相同(所有0或全1),你能用逻辑函数检查吗?

谢谢!

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:6)

假设byte有一个无符号的8位类型[编辑:并假设您的意思是&&,而不是||],您可以尝试:

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

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

您还可以查看编译器生成的内容,如果您怀疑编译器的优化不是很好,请查看其他更好的编译器生成的内容。这可能会为您提供其他在逻辑上等效的表达式的想法。

答案 2 :(得分:2)

条件总是如此。

<击> 我严重怀疑上述检查可以进行多大的修改。

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

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

这里有大约4条指令。这里没有太多优化。

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

答案 3 :(得分:2)

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

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

基本上相当于:

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