Result of bitwise AND appears to be 0, but isn't

bitwise operators
bitwise or calculator
bitwise product
binary operators
bitwise and of two numbers is zero
bitwise check if zero
bit manipulation tricks
xor operator

I've got the following situation:

#include <stdio.h>

int main(void) {
  int first = 0x08;

  printf("%d\n", first & 0b10);
  printf("%d\n", first & 0b10 == 0);

  if (first & 0b10 == 0) {
    printf("SET");
  } else {
    printf("NOT");
  }

  return 0;
}

Two 0s print out, followed by NOT. What is happening here? It seems to be that first & 0b01 is zero, so should pass the condition.

This is an issue of operator precedence.

The bitwise AND operator & has lower precedence than the equality operator ==. So this:

first & 0b10 == 0

Is the same as:

first & (0b10 == 0)

Which is not what you want. It compares 0b10 for equality with 0, which is false. Then first & 0 is evaluated which is 0.

Add parenthesis to get the desired behavior:

(first & 0b10) == 0

Ivor Horton's Beginning ANSI C++: The Complete Language, With operations on unsigned integer types, of course, the sign bit isn't If the corresponding bits are different (that is, one is 1 and the other is 0), then the resulting bit is 1. The operators appear here in order of precedence, so the bitwise  The bitwise OR operator compares two bits and generates a result of 1 if one or more of its inputs are 1 otherwise 0. If X and Y are variable/constant that holds binary value (0 or 1). Example

This is called operator precedence.

first & 0b10 == 0

First evaluated:

0b10 == 0  // which is false ==> 0

Then

first & 0  // which is also 0

To get the result you expect use parenthesis to force the order of evaluation:

(first & 0b10) == 0  // this will true ==> 1

Check if a number is non zero using bitwise operators in C, Select only flipped bit that flipped to one. Most significant bit only flips as a result of subtracting one if x is zero. Move most-significant bit to  The OR operator compares 2 bits. If either of them is a 1, or both of them is a 1, then the result is 1, otherwise the result is 0. EXCLUSIVE OR (XOR) ^ The EXCLUSIVE OR operator compares 2 bits. If either of them is a 1, the result is 1. If they are both 0 or both 1, then the result is 0. (Both bits must be different for the result to be a 1

because == has higher precedence than &.

Here is the reference: Operator Precedence

Beginning C++, You can apply the bitwise shift operators to signed and unsigned integers. In some cases, a right shift will introduce “0” bits at the left to fill vacated bit positions​. Result is 1110 0110 The binary result when the sign is propagated is shown in the With operations on unsigned integer types, of course, the sign bit isn't  Notice that an & is particularly useful in knowing if a position in a bit pattern already is filled with a 1, because when it isn’t the result will be 0. 11011 & 00100 = 1&0 1&0 0&1 1&0 1&0

How Software Works: The Magic Behind Encryption, CGI, Search , ignore the “carry” at the left side of the result and keep only the 32 bits on the right​. It's like working with a cheap calculator that has just a two-digit display, so when you add 75 and 49, 1 0 0 1 1 1 0 0 Original 0 1 1 0 0 0 1 1 NOT Figure 2-2: The bitwise NOT operation. As with OR, the AND operation isn't reversible. 1 0 0  Operators are used to cause an operation (or mathematical action) to be performed on one (such as !) or two operands. The easy and common example is 1 + 2 where 1 and 2 are operands, and the + is the operator.

18.2.1: Bitwise Operators, Remember, you can use octal constants in C by prefixing them with an extra 0 Each bit in the result is 1 if one, but not both, of the corresponding bits in the two Usually it isn't worth worrying about this, though, because most compilers are  The result of ANDing $0$ and any other octet results is just $0$. We can use this behavior to our advantage. If we want the network identifier to occupy the first three octets of an IP address, then we just have to set the first three octets of the subnet mask to $255$ with the last octet set to 0.

Bitwise operators, The number 0 is the integer that is composed completely of 0 bits. The operator is applied to each pair of bits, and the result is constructed bitwise. the value one will set the corresponding flag, if that flag isn't already set. Also, considering that the images change randomly, the header is to some extent unique for each image (EDIT: To clarify: using same code and input image, the output is not consistent for each conversion). <UPDATE>: This is the part of the code which errs: mask: [255 255 0 0] image: [200 150 100 50] result of cv2.bitwise_and(b,b,mask=a): [[200

Comments
  • Precedence rules: first & 0b10 == 0 should be (first & 0b10) == 0
  • I always find it non-intuitive (and I see many similar mistakes). I wonder what is the reason behind making bitwise operator lower precedence than the comparison... These should be on par with arithmetic ops if you ask me.
  • @EugeneSh.The only reason I can think of is grouping them with the logical AND and OR operators, but even then ^, &, |, &&, and || are all at their own precedence levels, meanwhile ! and ~ are above the arithmetic operators.
  • Dennis Ritchie on the relative precedence of & and ==: lysator.liu.se/c/dmr-on-or.html