No it's not an error, it's intentional. The result is the same (eg: only i==0 && o==0 will return 0), except that the bitwise OR produces more efficient code than the logical one which depending on the compiler and code will produce conditional jumps and explicit setting to 1 or 0. Since a boolean true is anything not zero, we don't care about the output value and we can safely use a bitwise OR.Here's a typical example : int bitwise_or(int a, int b) { return a | b; } int logical_or(int a, int b) { return a || b; } The ASM code gives this with gcc 4.2 in x86 mode : 00000000 <bitwise_or>: 0: 8b 44 24 08 mov 0x8(%esp),%eax 4: 0b 44 24 04 or 0x4(%esp),%eax 8: c3 ret 9: 8d 76 00 lea 0x0(%esi),%esi 0000000c <logical_or>: c: 8b 44 24 04 mov 0x4(%esp),%eax 10: 85 c0 test %eax,%eax 12: 74 08 je 1c <logical_or+0x10> 14: b8 01 00 00 00 mov $0x1,%eax 19: c3 ret 1a: 89 f6 mov %esi,%esi 1c: 31 c0 xor %eax,%eax 1e: 83 7c 24 08 00 cmpl $0x0,0x8(%esp) 23: 0f 95 c0 setne %al 26: c3 ret Two instructions for the first one, 8 for the second. Some compiler versions produce better code (especially the older ones), it really depends in fact. Anyway the first one is always better since it does not have to build new values. Best regards, Willy
Hi, Willy Thanks for your detailed analysis. Cool! I have observed some optimizations in HAProxy before, it is a new one. Best Regards, Godbach -- Best Regards, Godbach

