Google
 
   
Login
Username:

Password:


Lost Password?

Register now!
Search
Main Menu
top books
Polls
What do you think about php-deluxe.net?
Excellent!
Cool
Hmm..not bad
What the hell is this?
encyclopedia
recommendation
compare webbrowser
Freenet DSL
Who's Online
12 user(s) are online (10 user(s) are browsing encyclopedia)

Members: 0
Guests: 12

more...
browser tip
Unix Befehle
manual of unix befehle
recommendation!
Sponsored
partner

Bitwise operation

In computer programming, a bitwise operation operates on one or two bit patterns or Binary numeral system at the level of their individual Bits. On many computers, bitwise operations are slightly faster than addition and subtraction operations and significantly faster than multiplication and division operations.

=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 programming language and C plus plus 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 Logical disjunction 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 | (vertical bar). 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 vertical bars), 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 Flag (computing); the bits in a single binary numeral may each represent a distinct Boolean algebra 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 exclusive OR takes two bit patterns of equal length and performs the logical Exclusive disjunction 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 ^ (circumflex). For example:

x = y ^ z;

assigns x the result of y XOR z .

Assembly language programmers sometimes use the XOR operation as a short-cut to set the value of a Processor register to zero. Performing XOR on a value against itself always yields zero, and on many architectures, this operation requires fewer Central processing unit clock cycles than the sequence of operations that may be required to load a zero value and save it to the register.

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===

*Xor swap algorithm

== AND ==

A bitwise AND takes two binary representations of equal length and performs the logical Logical conjunction 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. Processor 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.

===Arithmetic 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 is often in the carry flag though that can t usually be accessed in high level languages), 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++ (and many other languages), 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

This is similar to the rotate operation but the carry flag is considered to be between the ends of the numbers. This operation can be used as a logical or arithmetic shift by setting up the carry flag beforehand. For this reason some microcontrollers such as pics just have rotate and rotate through carry and don t bother with arithmetic or logical shift instructions. Rotate through carry is especially useful when performing shifts on numbers larger than the processors native word size.

=Applications=

Although machines often have efficient built-in instructions for performing arithmetic and logical operations, in fact all these operations can be performed just by combining the bitwise operators and zero-testing in various ways. For example, here is a Pseudocode example showing how to multiply two arbitrary integers, a and b, using bit shift and addition: c := 0 while b ≠ 0 if b and 1 ≠ 0 c := c + a shift a left by one shift b right by one return c

=See also=

*Boolean algebra *Logic gate *Logical operator *Karnaugh map

=External links=

*[http://www.gamedev.net/reference/articles/article1563.asp GameDev.net - Bitwise Operations in C]