FACTOID # 35: Looking for Czech and Slovak men? Half are in factories.
 
 Home   Encyclopedia   Statistics   Countries A-Z   Flags   Maps   Education   Forum   FAQ   About 
 
 
 
WHAT'S NEW
RECENT ARTICLES
More Recent Articles »
 

SEARCH ALL

FACTS & STATISTICS    Advanced view

Search encyclopedia, statistics and forums:

 

 

(* = Graphable)

 

 


Encyclopedia > Bitwise AND

In computer programming, a bitwise operation operates on one or two bit patterns or binary numerals at the level of their individual bits. On many computers, bitwise operations are faster than normal arithmetic operations.

Contents

Bitwise operators

NOT

A bitwise NOT or complement is a unary operation which performs logical negation on each bit. 0 digits become 1, and vice versa. For example:

 NOT 0111 = 1000 

In the C and C++ programming languages, the NOT operator is "~" (tilde). For example:

 x = ~y; 

assigns x the result of "NOT y". This is different from the C and C++ logical "not" operator, "!" (exclamation point), which treats the entire numeral as a single Boolean value. For example:

 x = !y; 

assigns x a Boolean value of "true" if y is "false", or "false" if y is "true". In C and C++, a numerical value is interpreted as "true" if it is non_zero. The logical "not" is not normally considered a bitwise operation, since it does not operate at the bit level.


Bitwise NOT is useful in finding the one's complement of a binary numeral, and may be an intermediate step in finding the two's complement of the same numeral.


OR

A bitwise OR takes two bit patterns of equal length, and produces another one of the same length by matching up corresponding bits (the first of each; the second of each; and so on) and performing the logical OR operation on each pair of corresponding bits. In each pair, the result is 1 if the first bit is 1 OR the second bit is 1. Otherwise, the result is zero. For example:

 0101 OR 0011 = 0111 

In C/C++, the bitwise OR operator is "|" (pipe). For example:

 x = y | z; 

assigns x the result of "y OR z". This is different from the C and C++ logical "or" operator, "||" (two pipes), which treats its operands as Boolean values, and results in "true" or "false".


The bitwise OR may be used in situations where a set of bits are used as flags; the bits in a single binary numeral may each represent a distinct Boolean variable. Applying the bitwise OR operation to the numeral along with a bit pattern containing 1 in some positions will result in a new numeral with those bits set. For example:

 0010 

can be considered as a set of four flags. The first, second, and fourth flags are not set (0); the third flag is set (1). The first flag may be set by applying the bitwise OR to this value, along with another value in which only the first flag is set:

 0010 OR 1000 = 1010 

This technique may be employed by programmers who are working under restrictions of memory space; one bit pattern can represent the states of several independent variables at once.


XOR

A bitwise XOR takes two bit patterns of equal length and performs the logical XOR operation on each pair of corresponding bits. The result in each position is 1 if the two bits are different, and 0 if they are the same. For example:

 0101 XOR 0011 = 0110 

In C/C++, the bitwise XOR operator is "^" (caret). For example:

 x = y ^ z; 

assigns x the result of "y XOR z".


Some assembly language programmers have used the XOR operation as a short-cut to set the value of a register to zero. On many architectures, the XOR operation requires fewer CPU clock cycles than the sequence of operations that may be required to load a zero value and save it to the register. Using a given value as input to both sides of the bitwise XOR operation always results in an output of zero; by XORing a register with itself, that register can be easily set to zero.


The bitwise XOR may also be used to toggle flags in a set of bits. Given a bit pattern:

 0010 

The first and third bits may be toggled simultaneously by a bitwise XOR with another bit pattern containing 1 in the first and third positions:

 0010 XOR 1010 = 1000 

This technique may be used to manipulate bit patterns representing sets of Boolean variables.


See also

AND

A bitwise AND takes two binary representations of equal length and performs the logical AND on each pair of corresponding bits. In each pair, the result is 1 if the first bit is 1 AND the second bit is 1. Otherwise, the result is zero. For example:

 0101 AND 0011 = 0001 

In C/C++, the bitwise AND operator is "&" (ampersand). For example:

 x = y & z; 

assigns x the result of "y AND z". This is different from the C and C++ logical "and" operator, "&&", which takes two logical operands as input and produces a result of "true" or "false".


The bitwise AND may be used to perform a bit mask operation. This operation may be used to isolate part of a string of bits, or to determine whether a particular bit is 1 or 0. For example, given a bit pattern:

 0101 

To determine whether the third bit is 1, a bitwise AND is applied to it along with another bit pattern containing 1 in the third bit, and 0 in all other bits:

 0101 AND 0010 = 0000 

Since the result is zero, the third bit in the original pattern was 0. Using bitwise AND in this manner is called bit masking, by analogy to the use of masking tape to cover, or mask, portions that should not be altered, or are not of interest. The 0 values mask the bits that are not of concern, in this case.


Bit shift

The bit shift is sometimes considered a bitwise operation, since it operates on a set of bits. Unlike the above, the bit shift operates on the entire numeral, rather than on individual bits. In this operation, the digits are moved, or shifted, to the left or right. Registers in a computer processor have a fixed number of available bits for storing numerals, so some bits may be shifted past the "end" of the register; the different kinds of shift typically differ in what they do with the bits that are shifted past the end.

Enlarge
Left arithmetic shift
Right arithmetic shift
Enlarge
Right logical shift
Enlarge
Right circular shift
Enlarge
Left circular shift

One common form of shift is the arithmetic shift; in this shift, the bits that move past the end disappear. The new spaces are filled with zero, in the case of a left arithmetic shift, or with the sign bit, in the case of a right arithmetic shift. This example uses a 4-bit register:

 0111 LEFT-SHIFT = 1110 
 0111 RIGHT-SHIFT = 0011 

In the first case, the leftmost 0 was shifted past the end of the register, and a new 0 was shifted into the rightmost position. In the second case, the rightmost 1 was shifted past the end, and the sign bit 0 was copied into the leftmost position. Multiple shifts are sometimes shortened to a single shift by some number of digits. For example:

 0111 LEFT-SHIFT-BY-TWO = 1100 

In C/C++, the left and right shift operators are "<<" and ">>", respectively. The number of places to shift is given as an argument to the shift operators. For example:

 x = y << 2; 

assigns x the result of shifting y to the left by two digits, using the arithmetic shift.


A left arithmetic shift is equivalent to multiplying by two (provided the value does not overflow), while a right arithmetic shift is equivalent to dividing by two and rounding down.


Another form of shift is the circular shift or bit rotation. In this, the bits are "rotated" as if the left and right ends of the numeral were joined. Any digits which are shifted past the rightmost place are moved to the leftmost place, and vice-versa. This operation is useful if it is necessary to retain all the existing bits.


Applications

All operations can be created just by combining the bitwise operators, their usage is not limited to multiplying with the powers of two only. Here is a pseudocode example on how to multiply two arbitrary integers, a and b:

 1. set c = 0 2. if( the rightmost bit of b is set ) 3 c = c + a 4. shift a left by one 5. shift b right by one 6. if( b != 0 ) 7. jump to 2 8. c is the answer. 

See also

External links

  • GameDev.net - Bitwise Operations in C (http://www.gamedev.net/reference/articles/article1563.asp)



  Results from FactBites:
 
MSNP8:Bitwise AND - MSNPiki (1546 words)
Bitwise NOT is useful in finding the one's complement of a binary numeral, and may be an intermediate step in finding the two's complement of the same numeral.
The bitwise OR may be used in situations where a set of bits are used as flags; the bits in a single binary numeral may each represent a distinct Boolean variable.
The bitwise XOR may also be used to toggle flags in a set of bits.
Tutorial: Bitwise Operations (558 words)
Bitwise operations modify the pattern of bits in an object.
To understand bitwise operations, it is necessar y to have some background in binary numbers.
In C++, which is the language these tutorials focus on, the bitwise and is a single "&." When two bits are compared using the and operator, a one is returned if both are one, and a zero is returned in all other cases.
  More results at FactBites »


 
 

COMMENTARY     


Share your thoughts, questions and commentary here
Your name
Your comments

Want to know more?
Search encyclopedia, statistics and forums:

 


Lesson Plans | Student Area | Student FAQ | Reviews | Press Releases |  Feeds | Contact
The Wikipedia article included on this page is licensed under the GFDL.
Images may be subject to relevant owners' copyright.
All other elements are (c) copyright NationMaster.com 2003-5. All Rights Reserved.
Usage implies agreement with terms, 1022, m