Bitwise operator

This section describes bit operators in C language. Bitwise operations are operations performed in 1-bit units.

Bit AND operator &
Bit OR operator |
Bit XOR operator ^
Bit NOT operator ~

Bit AND operator

The bit AND operator "&" sets 1 at the corresponding position of the value to be returned if both of the bits contained in the two operands are 1, and 0 if either of the bits is 0. Set.

#Bit AND
x & y

Let's assume that both x and y are 8-bit unsigned integer type. z is the resulting value of the bit AND operator. If both the bits at the x and y positions are 1, the corresponding z bits are also 1, otherwise they are 0.

x 01001100
y 01000101

z 01000100

A sample bit AND operator.

#include <stdio.h>
#include <stdint.h>

int main (void) {
  // 01001100
  uint8_t x = 0x4C;
  
  // 01000101
  uint8_t y = 0x45;
  
  // 01000100
  uint8_t z = x & y;
  
  printf("%X\n", z);
}

This is the output result. The output is in hexadecimal, but if it is binary, it is "01000100".

44

Bit OR operator

The bit OR operator "|" is set to 1 at the corresponding position of the value to be returned when either of the bits contained in the two operands is 1 (both may be 1), and both of the bits are set. If is 0, set it to 0.

# Bit OR
x | y

Let's assume that both x and y are 8-bit unsigned integer type. z is the resulting value of the bit OR operator. If either the bit at the position of x or y is 1, the corresponding bit of z is also 1, and if both are 0, it is 0.

x 01001100
y 01000101

z 01001101

This is a sample of the bit OR operator.

#include <stdio.h>
#include <stdint.h>

int main (void) {
  // 01001100
  uint8_t x = 0x4C;
  
  // 01000101
  uint8_t y = 0x45;
  
  // 01001101
  uint8_t z = x | y;
  
  printf("%X\n", z);
}

This is the output result. The output is in hexadecimal, but if it is binary, it is "01001101".

4D

Bit XOR operator

The bit XOR operator "^" is set to 1 at the corresponding position of the value to be returned if only one of the bits contained in the two operands is 1, and both of the bits are 0 or 1. If so, set it to 0.

#Bit XOR
x ^ y

Let's assume that both x and y are 8-bit unsigned integer type. z is the resulting value of the bit XOR operator. If only one bit at one of the x and y positions is 1, the corresponding z bit is also 1, and if both are 0 or 1, it is 0.

x 01001100
y 01000101

z 00001001

A sample bit XOR operator.

#include <stdio.h>
#include <stdint.h>

int main (void) {
  // 01001100
  uint8_t x = 0x4C;
  
  // 01000101
  uint8_t y = 0x45;
  
  // 0001001
  uint8_t z = x ^ y;
  
  printf("%X\n", z);
}

This is the output result. The output is in hexadecimal, but if it is binary, it is "0001001".

9

Bit NOT operator

The bit NOT operator "~" inverts a bit contained in the operand.

# Bit NOT
~ x

Let's assume that both x and y are 8-bit unsigned integer type. z is the result value of the bit NOT operator. The x bit is inverted.

x 01001100

z 10110011

This is a sample of the bit NOT operator. The output result is bit ANDed with "0xFF" to eliminate the effect of integer type extension. ..

#include <stdio.h>
#include <stdint.h>

int main (void) {
  // 01001100
  uint8_t x = 0x4C;
  
  // 01000101
  uint8_t y = 0x45;
  
  // 10110011
  uint8_t z = ~ x;
  
  printf("%X\n", z);
}

This is the output result. The output is in hexadecimal, but if it is binary, it is "01000100".

B3

Special operator that combines bit operator and "="

There are special operators that combine bitwise operators with "=".

# Same meaning as "x = x & y"
x & = y

# Same meaning as "x = x | y"
x | = y

# Same meaning as "x = x ^ y"
x ^ = y

When do you use bitwise operators in practice?

The most common use of bitwise operators is when passing flags to function arguments. In C language, flags are often passed as integers, but in that case, the meaning is determined by the position of the bit. Use enum enum to define a flag for each bit. 1 (1 in binary), 2 (10 in binary), 4 (100 in binary), 8 (1000 in binary).

Bit OR "| =" to set each bit, and bit XOR "^ =" to drop each bit.

Use "&" to check if a bit is set.

Sample code to create a flag to pass to a function argument.

#include <stdio.h>
#include <stdint.h>

enum {
  MYAPP_FLAG1 = 1,
  MYAPP_FLAG2 = 2,
  MYAPP_FLAG3 = 4,
  MYAPP_FLAG4 = 8,
  MYAPP_FLAG5 = 16,
  MYAPP_FLAG6 = 32,
  MYAPP_FLAG7 = 64,
  MYAPP_FLAG8 = 128,
  MYAPP_FLAG9 = 256,
  MYAPP_FLAG10 = 512,
};;

int main (void) {
  uint32_t flag = 0;
  
  // Build MYAPP_FLAG4
  flag | = MYAPP_FLAG4;
  
  // 00000000 00000000 00000000 00001000
  printf("%X\n", flag);
  
  // Build MYAPP_FLAG10
  flag | = MYAPP_FLAG10;

  // 00000000 00000000 00000010 00001000
  printf("%X\n", flag);
  
  // Drop MyAPP_FLAG4
  flag ^ = MYAPP_FLAG4;
  
  // 00000000 00000000 00000010 00000000
  printf("%X\n", flag);
  
  // Check if the bit is set
  if (flag & MYAPP_FLAG10) {
    printf("MYAPP_FLAG10 ok\n");
  }
}

Associated Information