# Bitwise operations

Bitwise operators include:

 & AND &= AND | OR |= OR ^ XOR ~ one's compliment << Shift Left >> Shift Right <<= Shift Left >>= Shift Right

## AND OR and XOR

These require two operands and will perform bit comparisions.

AND & will copy a bit to the result if it exists in both operands.

 ``` main() { unsigned int a = 60; /* 60 = 0011 1100 */ unsigned int b = 13; /* 13 = 0000 1101 */ unsigned int c = 0; c = a & b; /* 12 = 0000 1100 */ } ```

OR | will copy a bit if it exists in eather operand.

 ``` main() { unsigned int a = 60; /* 60 = 0011 1100 */ unsigned int b = 13; /* 13 = 0000 1101 */ unsigned int c = 0; c = a | b; /* 61 = 0011 1101 */ } ```

XOR ^ copies the bit if it is set in one operand (but not both).

 ``` main() { unsigned int a = 60; /* 60 = 0011 1100 */ unsigned int b = 13; /* 13 = 0000 1101 */ unsigned int c = 0; c = a ^ b; /* 49 = 0011 0001 */ } ```

## Ones Complement

This operator is unary (requires one operand) and has the efect of 'flipping' bits.

 ``` main() { unsigned int Value=4; /* 4 = 0000 0100 */ Value = ~ Value; /* 251 = 1111 1011 */ } ```

## Bit shift.

The following operators can be used for shifting bits left or right.

 << >> <<= >>=

The left operands value is moved left or right by the number of bits specified by the right operand. For example:

 ``` main() { unsigned int Value=4; /* 4 = 0000 0100 */ unsigned int Shift=2; Value = Value << Shift; /* 16 = 0001 0000 */ Value <<= Shift; /* 64 = 0100 0000 */ printf("%d\n", Value); /* Prints 64 */ } ```

Usually, the resulting 'empty' bit is assigned ZERO. Please use unsigned variables with these operators to avoid unpredictable results.

The simultaor will only work if the CGI scripts have been installed.

## Problem: Bit shifting problem. All the other Expressions and operators. Operator precedence. Assignment Operators.