1

是否有一个逻辑等价于:

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

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

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

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

谢谢!

4

4 回答 4

6

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

于 2012-09-14T12:46:37.390 回答
6

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

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

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

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

于 2012-09-14T12:48:15.673 回答
2

条件始终为真。

我严重怀疑上述检查是否可以压缩很多。

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

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

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

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

于 2012-09-14T12:50:03.723 回答
2

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

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

这基本上相当于:

((unsigned char)byte - 1) <= -3 // or 0xFD
于 2012-09-14T13:46:03.733 回答