1.Shift left operation
Description
Shifting bits left with n positions means moving every bit from its position n positions to the left starting with the leftmost bit. The bits who are added right will have the value 0.
Example:
In the first row, the bits who will be lost have a red background, and the bits who will be shifted have a green background. In the second row the bits who were added have a red background and the bits who were shifted have a green background.
Bits
|
7th
|
6th
|
5th
|
4th
|
3th
|
2nd
|
1st
|
0th
| |
a
|
0
|
1
|
1
|
0
|
1
|
0
|
1
|
1
|
107
|
a<<3
|
0
|
1
|
0
|
1
|
1
|
0
|
0
|
0
|
88
|
Syntax
#include<stdio.h> #include<stdint.h> int main(void) { uint8_t a = 107U; uint8_t ashiftleft3 = a<<3; printf("a<<3 %u",ashiftleft3); return 0; } /*Output a<<3 88 */
2.Shift right operation
DescriptionShifting bits right with n positions means moving every bit from its position n positions to the right starting with the rightmost bit. The bits who are added left will have the value 0.
Example:
Bits
|
7th
|
6th
|
5th
|
4th
|
3th
|
2nd
|
1st
|
0th
| |
a
|
0
|
1
|
1
|
0
|
1
|
0
|
1
|
1
|
107
|
a<<3
|
0
|
0
|
0
|
0
|
1
|
1
|
0
|
1
|
13
|
Syntax:
#include<stdio.h> #include<stdint.h> int main(void) { uint8_t a = 107U; uint8_t ashiftrightt3 = a>>3; printf("a>>3 %u",ashiftrightt3); return 0; } /*Output a<<3 88 */
3.Rotate left operation
DescriptionRotating left with n positions means moving the first n leftmost bits from their position to the right of the rightmost bit.
Some compilers have the function unsigned int _rotl(unsigned int number, unsigned int bits) which performs a left rotation, but the function is not considered ANSI. Also, the function uses 32 bits instead of 8. The _rotl function can be found in the stdlib.h library.
If you do not have this function for your compiler (or you want its 8 bit version), you can easily implement it as:
uint8_t _rotl(uint8_t value, uint8_t shift) { if ((shift &= 7) == 0) { return value; } else { return ((value << shift) | (value >> (8 - shift))); } }Example
Bits
|
7th
|
6th
|
5th
|
4th
|
3th
|
2nd
|
1st
|
0th
| |
a
|
0
|
1
|
1
|
0
|
1
|
0
|
1
|
1
|
107
|
Bits
|
4th
|
3th
|
2nd
|
1st
|
0th
|
7th
|
6th
|
5th
| |
_rotl(a,3)
|
0
|
1
|
0
|
1
|
1
|
0
|
1
|
1
|
91
|
#include<stdio.h> #include<stdint.h> uint8_t _rotl(uint8_t value, uint8_t shift); int main(void) { uint8_t a = 107U; uint8_t arotl3 = _rotl(a,3); printf("arotl3 %u",arotl3); return 0; } /*Output arotl3 91 */
4.Rotate right operation
DescriptionRotating right with n positions means moving the first n rightmost bits from their position to the left of the leftmost bit.
Some compilers have the function unsigned int _rotr(unsigned int number, unsigned int bits) which performs a right rotation, but the function is not considered ANSI. Also, the function uses 32 bits instead of 8. The _rotl function can be found in the stdlib.h library.
If you do not have this function for your compiler (or you want its 8 bit version), you can easily implement it as:
If you do not have this function for your compiler (or you want its 8 bit version), you can easily implement it as:
uint8_t _rotr(const uint8_t value, uint8_t shift) { if( (shift &= 7) == 0) { return value; } else { return ( (value >> shift) | (value << (8 - shift)) ); } }
Example
Bits
|
7th
|
6th
|
5th
|
4th
|
3th
|
2nd
|
1st
|
0th
| |
a
|
0
|
1
|
1
|
0
|
1
|
0
|
1
|
1
|
107
|
Bits
|
2nd
|
1st
|
0th
|
7th
|
6th
|
5th
|
4th
|
3th
| |
_rotr(a,3)
|
0
|
1
|
1
|
0
|
1
|
1
|
0
|
1
|
109
|
#include<stdio.h> #include<stdint.h> uint8_t _rotr(uint8_t value, uint8_t shift); int main(void) { uint8_t a = 107U; uint8_t arotr3 = _rotr(a,3); printf("arotl3 %u",arotr3); return 0; } /*Output arotl3 109 */
Question: In which context do you use shifts and rotations?
References:
http://en.wikipedia.org/wiki/Bitwise_operations_in_C
No comments:
Post a Comment
Got a question regarding something in the article? Leave me a comment and I will get back at you as soon as I can!