次と同等の論理はありますか?
if(byte != 0x00 || byte != 0xFF)
if(byte != 0x00 && byte != 0xFF)
私はプログラムのメモリ制限に達しており、あらゆる最適化を使用できます:)
言葉で説明するために、すべてのビットが同じであるかどうか(つまり、すべて0またはすべて1)を論理関数で確認できますか?
ありがとう!
次と同等の論理はありますか?
if(byte != 0x00 || byte != 0xFF)
if(byte != 0x00 && byte != 0xFF)
私はプログラムのメモリ制限に達しており、あらゆる最適化を使用できます:)
言葉で説明するために、すべてのビットが同じであるかどうか(つまり、すべて0またはすべて1)を論理関数で確認できますか?
ありがとう!
多分(unsigned char)(byte + 1) > 1
?&&
もちろん、あなたが意味すると仮定します。CHAR_BIT == 8
そして、「すべてのビットを設定」したい場合は、を意味すると仮定します0xFF
。
それbyte
が符号なし8ビット型であると仮定して[編集:そしてあなたが意味していると仮定して&&
、ではなく||
]、あなたは試すことができます:
!((uint8_t)(byte+1) <= 1)
明らかに、これがより小さなコードを生成するかどうかを言うことはできません、あなたはそれを試して見る必要があります。他の人が他の論理的に同等の表現を思い付くことができることは間違いありません。
また、コンパイラーが生成したものを確認することもできます。コンパイラーの最適化があまりよくない場合は、他のより優れたコンパイラーが生成したものを確認してください。それはあなたに論理的に同等である他の表現のための考えを与えるかもしれません。
条件は常に真です。
上記のチェックを大幅に圧縮できるかどうかは真剣に疑っています。
命令レベルでは、ifは次のようになります。
; if(byte != 0x00 || byte != 0xFF)
cmp byte, 0
jnz ifbody
cmp byte, 0xFF
jz skipifbody
ifbody:
;{
; if body
;}
skipifbody:
ここには約4つの指示があります。ここで最適化することはあまりありません。
サイズを最適化するために、コード内の他の場所を探します。ただし、最初に確認するのはコードではなくデータです。
元のコードを考えると、GCCは、以下を使用したときにKerrekSBの答えに似たものを生成するのに十分賢いことがわかりました-O2
。
movzbl 8(%ebp), %eax
subl $1, %eax
cmpb $-3, %al
setbe %al
これは基本的に次のものと同等です。
((unsigned char)byte - 1) <= -3 // or 0xFD