是否有逻辑等价物:
if(byte != 0x00 || byte != 0xFF)
if(byte != 0x00 && byte != 0xFF)
我已达到程序内存限制,可以使用每个优化:)
用文字解释,你能用逻辑函数检查所有位是否都相同(所以所有 0 或全部 1)?
谢谢!
假设byte
有一个无符号的8位类型[编辑:假设你的意思是&&
,而不是||
],你可以尝试:
!((uint8_t)(byte+1) <= 1)
显然,不可能说这是否会产生更小的代码,你只需要尝试一下,看看。毫无疑问,其他人可以想出其他逻辑上等效的表达方式。
您还可以查看编译器生成的内容,如果您怀疑编译器的优化不是很好,请查看其他更好的编译器生成的内容。这可能会让您想到逻辑上等效的其他表达式。
也许(unsigned char)(byte + 1) > 1
?假设你的意思是&&
,当然。假设CHAR_BIT == 8
,如果您希望"所有位集"表示0xFF
.
条件始终为真。
我严重怀疑上述检查是否可以压缩很多。
在指令级别,if 看起来像这样:
; if(byte != 0x00 || byte != 0xFF)
cmp byte, 0
jnz ifbody
cmp byte, 0xFF
jz skipifbody
ifbody:
;{
; if body
;}
skipifbody:
这里有大约 4 条说明。这里没有太多需要优化的地方。
我会在代码中寻找其他地方来优化大小。不过,首先要看的是数据,而不是代码。
我发现给定您的原始代码GCC足够聪明,可以在使用-O2
时生成类似于Kerrek SB的答案:
movzbl 8(%ebp), %eax
subl $1, %eax
cmpb $-3, %al
setbe %al
这基本上相当于:
((unsigned char)byte - 1) <= -3 // or 0xFD