User:Fabien Labeyrie/Bit Shifting: Difference between revisions

From XPUB & Lens-Based wiki
No edit summary
No edit summary
 
(4 intermediate revisions by the same user not shown)
Line 1: Line 1:
__NOTOC__
__NOTOC__
__NOEDITSECTION__
__NOEDITSECTION__
==<span style="color:#00FF00">Bit Shifting : how i learned to stop worrying and love binary numbers</span>==
<div style="width: 600px; font-family:Arial">
Here is how to deal with binary numbers when you are programming on an old computer (Basic V 2.0 on Commodore 64) or when you are configuring internal parameters on your arduino board. Thanks to Mr. Stock who made this nightmare look nearly simple.


==<span style="color:#0B0080">Bit Shifting : how i learned to stop worrying and love binary numbers</span>==
<hr style="height:5px; margin-top:-15px; background-color:#FFF">
<br />
<br />
==What is << (bit shifting) ?==
 
Here is how to deal with binary numbers when you are programming on an old computer (''Basic V 2.0'' on Commodore 64) or when you are configuring internal parameters on your arduino board. Thanks to Mr. Stock who made this nightmare looking almost simple.
 
<br />
==<div style="margin-top:30px">What is a bit ?</div>==
<hr style="height:5px; margin-top:-15px; background-color:#FFF">
 
In the binary numeral system, everything looks like 0110010100010100111... <br />
In the binary numeral system, everything looks like 0110010100010100111... <br />
The bit "is the basic unit of information in computing ([http://en.wikipedia.org/wiki/Bit Wikipedia])". It can be a 1 or a 0.
====Bit weight====
In a series of bit, each digit has got a particular weight. Let's take a series of 8 bits :
<br />
<pre>
Series = 01010110
        0  1  0  1  0  1  1  0
Weight : 128 64  32  16  8  4  2  1 
</pre>
====Definitions====
:A series of 4 bits is called a '''nibble'''.
:A series of 8 bits is called a '''byte''' or '''octet''' (2 nibbles).
:The first digit -128 in the previous example- is called '''MSB''' (Most Significant Bit).
:The last digit -1 in the previous example- is called '''LSB''' (Less Significant Bit).
:You can also talk about '''MSN''' (Most Significant Nibble) and '''LSN''' (Less Significant Nibble).
====Big Endian Vs Little Endian====
There are two ways to order the bits. Usually for binary numbers we read from right to left. It is called '''Little Endian''' because we read the lower bit first. If we read the higher bit first, it is called '''Big Endian''' ordering.
<pre>
<-- Little Endian
Big Endian -->
</pre>
<br />
==<div style="margin-top:30px">What is << (bit shifting) ?</div>==
A bit shift consists in moving one or several digits in a line of 0110010100010100111... <br />
A bit shift consists in moving one or several digits in a line of 0110010100010100111... <br />
<hr style="height:5px; margin-top:-15px; background-color:#FFF">


====Examples====
====Examples====
Line 20: Line 57:
1 << 3 = 1000 and 1000 in the binary numeral system = 8
1 << 3 = 1000 and 1000 in the binary numeral system = 8
</pre>
</pre>
<br />


7 << 5
7 << 5
Line 28: Line 66:
7 << 5 = 1110000 in the binary numeral system = 224
7 << 5 = 1110000 in the binary numeral system = 224
</pre>
</pre>
<br />
==<div style="margin-top:30px">Logical operations</div>==
<hr style="height:5px; margin-top:-15px; background-color:#FFF">
Logical operations can be used to set or to clear a bit. For more information about [http://en.wikipedia.org/wiki/Logic_gate#Logic_gates logic gates].
====Examples====
<br />
Using the logical operator & (AND)
<pre>
RegX = 01110011
RegX & (1 << 3)
0111 0011 AND 0000 1000 = 0000 0000
</pre>
<br />
Setting a bit with | (OR)
<pre>
RegX = 01110011
RegX | (1 << 3)
0111 0011 OR 0000 1000 = 0111 1011
</pre>
<br />
Clearing a bit with & (AND) and NOT
<pre>
RegY = 01011011
NOT(1 << 3) = 11110111
RegY & NOT(1 << 3)
0101 1011 AND 1111 0111 = 0101 0011 
</pre>
<br />
====Operators, Hexadecimal and Decimal====
<br />
AND, NOT, OR and XOR
<pre>
Operator  Binary      Hexadecimal  Decimal
          0011 0010 =  0x32      =  50
NOT  ->  1100 1101 =  0xCD      =  205
          0110 1101 =  0x6D      =  104
          0001 1010 =  0x1A      =  26
AND  ->  0000 1000 =  0x08      =  8
 
          0111 1100 =  0x7C      =  124
          0000 0101 =  0x05      =  5
OR    ->  0111 1101 =  0x7D      =  125
          1111 1111 =  0xFF      =  255
          1000 1000 =  0x88      =  136
XOR  ->  0111 0111 =  0x77      =  119
</pre>
<br />
==<div style="margin-top:30px">A "Word" ?</div> ==
<hr style="height:5px; margin-top:-15px; background-color:#FFF">
In modern computing, a '''word''' refers to a group of bits usually 16, 32 or 64.
<hr style="height:5px; margin-top:-15px; background-color:#FFF">
====Examples====
<br />
16 bit word
<pre>
Series = 0110101001101100
                                      High byte | Low byte
                                                |
        0    1    1    0    1    0    1  0  | 0  1  1  0  1 1 0 0
Weight : 32768 16384 8192 4096 2048 1024 512 256 | 128 64 32 16 8 4 2 1
                                                |
                                       
</pre>
The '''High byte''' weights 256 times the '''Low byte'''.
<br />
<br />
===From a 16 bit word to 2 bytes===
When the computer's memory is too small to generate real 16 bit words, they virtually agglomerate 2 bytes together. We can access to those bytes independently: <br />
:Hbyte = Word / 256
:Lbyte = Word % 256 (% is the modulo)
====Examples====
<br />
257
<pre>
257 = 00000001 00000001                                     
      Hbyte  Lbyte
Hbyte = 257 / 256 = 1
Lbyte = 257 % 256 = 1                           
</pre>
<br />
260
<pre>
260 = 00000001 00000100                                     
      Hbyte  Lbyte
Hbyte = 260 / 256 = 1
Lbyte = 260 % 256 = 4                           
</pre>
<br />
===From 2 bytes to a 16 bit word===
The reverse operation is done by the following formula: <br />
:Word = (256 x Hbyte) + Lbyte


<br />
<br />
=The best is yet to come=
</div>
==The nibble==
==Big endian Vs little endian==
==Logical operations==
==Bits and modulo==

Latest revision as of 23:33, 6 April 2011


Bit Shifting : how i learned to stop worrying and love binary numbers



Here is how to deal with binary numbers when you are programming on an old computer (Basic V 2.0 on Commodore 64) or when you are configuring internal parameters on your arduino board. Thanks to Mr. Stock who made this nightmare looking almost simple.


What is a bit ?


In the binary numeral system, everything looks like 0110010100010100111...
The bit "is the basic unit of information in computing (Wikipedia)". It can be a 1 or a 0.

Bit weight

In a series of bit, each digit has got a particular weight. Let's take a series of 8 bits :

Series = 01010110

         0   1   0   1   0   1   1   0
Weight : 128 64  32  16  8   4   2   1  

Definitions

A series of 4 bits is called a nibble.
A series of 8 bits is called a byte or octet (2 nibbles).
The first digit -128 in the previous example- is called MSB (Most Significant Bit).
The last digit -1 in the previous example- is called LSB (Less Significant Bit).
You can also talk about MSN (Most Significant Nibble) and LSN (Less Significant Nibble).

Big Endian Vs Little Endian

There are two ways to order the bits. Usually for binary numbers we read from right to left. It is called Little Endian because we read the lower bit first. If we read the higher bit first, it is called Big Endian ordering.

<-- Little Endian
Big Endian --> 


What is << (bit shifting) ?

A bit shift consists in moving one or several digits in a line of 0110010100010100111...


Examples


1 << 3

1 = 0001 in the binary numeral system
1 << 3 means we are gonna move the value 1, to the left <<, 3 times.
1 << 3 : 0001  ->  0010  ->  0100  ->  1000   
               1st move  2nd move  3rd move

1 << 3 = 1000 and 1000 in the binary numeral system = 8


7 << 5

7 = 00000111
7 << 5 : 0000 0111  ->  0000 1110  ->  0001 1100  ->  0011 1000  ->  0111 0000  ->  1110 0000 

7 << 5 = 1110000 in the binary numeral system = 224


Logical operations


Logical operations can be used to set or to clear a bit. For more information about logic gates.

Examples


Using the logical operator & (AND)

RegX = 01110011

RegX & (1 << 3)
0111 0011 AND 0000 1000 = 0000 0000 


Setting a bit with | (OR)

RegX = 01110011

RegX | (1 << 3)
0111 0011 OR 0000 1000 = 0111 1011 


Clearing a bit with & (AND) and NOT

RegY = 01011011
NOT(1 << 3) = 11110111

RegY & NOT(1 << 3)
0101 1011 AND 1111 0111 = 0101 0011  


Operators, Hexadecimal and Decimal


AND, NOT, OR and XOR

Operator  Binary       Hexadecimal  Decimal


          0011 0010 =  0x32      =  50
NOT   ->  1100 1101 =  0xCD      =  205 

          0110 1101 =  0x6D      =  104
          0001 1010 =  0x1A      =  26
AND   ->  0000 1000 =  0x08      =  8
   
          0111 1100 =  0x7C      =  124
          0000 0101 =  0x05      =  5
OR    ->  0111 1101 =  0x7D      =  125

          1111 1111 =  0xFF      =  255
          1000 1000 =  0x88      =  136
XOR   ->  0111 0111 =  0x77      =  119


A "Word" ?


In modern computing, a word refers to a group of bits usually 16, 32 or 64.


Examples


16 bit word

Series = 0110101001101100

                                       High byte | Low byte
                                                 |
         0     1     1    0    1    0    1   0   | 0   1  1  0  1 1 0 0
Weight : 32768 16384 8192 4096 2048 1024 512 256 | 128 64 32 16 8 4 2 1 
                                                 |
                                        

The High byte weights 256 times the Low byte.

From a 16 bit word to 2 bytes

When the computer's memory is too small to generate real 16 bit words, they virtually agglomerate 2 bytes together. We can access to those bytes independently:

Hbyte = Word / 256
Lbyte = Word % 256 (% is the modulo)

Examples


257

257 = 00000001 00000001                                       
      Hbyte   Lbyte

Hbyte = 257 / 256 = 1
Lbyte = 257 % 256 = 1                             


260

260 = 00000001 00000100                                       
      Hbyte   Lbyte

Hbyte = 260 / 256 = 1
Lbyte = 260 % 256 = 4                             


From 2 bytes to a 16 bit word

The reverse operation is done by the following formula:

Word = (256 x Hbyte) + Lbyte