I like C language better than others in most case. However, one thing that I am not happy with C language is that it does not have much built-in functions for bit manipulation. In most application, you wouldn't need this kind of bit manipulation but if you are working with Embedded System programming or Parsing program, you would need to do a lot of bit manipulation. In this page, I will post tricks for manipulating bits and bytes in various situations. It is not difficult but would look confusing if you are not familiar with these tricks. I will keep adding examples of those bit manipulation in diverse situations so that you can use this as a small dictionary.
- Examples
- Printing Numbers in Binary Format
- Shifting the binary number
- Take out a specific bit
- Setting a specific bit (set it to be '1') and Unsetting all other bits (set it to be '0')
- Unsetting a specific bit (set it to be '0') and Setting all other bits (set it to be '1')
- Setting a specific bit (set it to be '1') without affecting other bits
- Unsetting a specific bit (set it to be '0') without affecting other bits
- Setting multiple bit (set it to be '1') and Unsetting all other bits (set it to be '0')
|
void printInt2Bin(int a) { int i,n;
n = sizeof(int)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
void printChar2Bin(int a) { int i,n;
n = sizeof(char)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
int main() {
printInt2Bin(123); printf("\n"); printChar2Bin(123);
return 1; } |
Result :----------------------------------
printInt2Bin(123); ==> 00000000 00000000 00000000 01111011
printChar2Bin(123); ==> 01111011
|
#include <stdio.h>
void printInt2Bin(int a) { int i,n;
n = sizeof(int)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
void printChar2Bin(int a) { int i,n;
n = sizeof(char)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
int main() {
char a = 100;
printf("a (Dec) => %d\n",a); printf("a (Bin) => "); printChar2Bin(a);
printf("\n"); printf("(a >> 1) => "); printChar2Bin(a >> 1); // Shift the number 'a' to the right by 1 bit
printf("\n"); printf("(a >> 4) => "); printChar2Bin(a >> 4); // Shift the number 'a' to the right by 4 bits
printf("\n"); printf("(a >> 8) => "); printChar2Bin(a >> 8); // Shift the number 'a' to the right by 8 bits
printf("\n"); printf("(a >> 10)=> "); printChar2Bin(a >> 10); // Shift the number 'a' to the right by 10 bits
printf("\n"); printf("(a << 1) => "); printChar2Bin(a << 1); // Shift the number 'a' to the left by 4 bit
printf("\n"); printf("(a << 4) => "); printChar2Bin(a << 4); // Shift the number 'a' to the left by 4 bits
printf("\n"); printf("(a << 8) => "); printChar2Bin(a << 8); // Shift the number 'a' to the left by 8 bits
printf("\n"); printf("(a << 10)=> "); printChar2Bin(a << 10); // Shift the number 'a' to the left by 10 bits
return 1; } |
Result :----------------------------------
a (Dec) => 100
a (Bin) => 01100100
(a >> 1) => 00110010
(a >> 4) => 00000110
(a >> 8) => 00000000
(a >> 10)=> 00000000
(a << 1) => 11001000
(a << 4) => 01000000
(a << 8) => 00000000
(a << 10)=> 00000000
|
#include <stdio.h>
void printInt2Bin(int a) { int i,n;
n = sizeof(int)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
void printChar2Bin(int a) { int i,n;
n = sizeof(char)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
int main() {
char a = 100;
printf("a (Dec) => %d\n",a); printf("a (Bin) => "); printChar2Bin(a);
printf("\n"); printf("(a >> 0) & 1 => %d", (a >> 0) & 1 );
printf("\n"); printf("(a >> 1) & 1 => %d", (a >> 1) & 1 );
printf("\n"); printf("(a >> 2) & 1 => %d", (a >> 2) & 1 );
printf("\n"); printf("(a >> 3) & 1 => %d", (a >> 3) & 1 );
printf("\n"); printf("(a >> 4) & 1 => %d", (a >> 4) & 1 );
printf("\n"); printf("(a >> 5) & 1 => %d", (a >> 5) & 1 );
printf("\n"); printf("(a >> 6) & 1 => %d", (a >> 6) & 1 );
printf("\n"); printf("(a >> 7) & 1 => %d", (a >> 7) & 1 );
return 1; } |
Result :----------------------------------
a (Dec) => 100
a (Bin) => 01100100
(a >> 0) & 1 => 0
(a >> 1) & 1 => 0
(a >> 2) & 1 => 1
(a >> 3) & 1 => 0
(a >> 4) & 1 => 0
(a >> 5) & 1 => 1
(a >> 6) & 1 => 1
(a >> 7) & 1 => 0
|
#include <stdio.h>
void printInt2Bin(int a) { int i,n;
n = sizeof(int)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
void printChar2Bin(int a) { int i,n;
n = sizeof(char)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
int main() {
char a = 100;
printf("a (Dec) => %d\n",a); printf("a (Bin) => "); printChar2Bin(a);
printf("\n"); printf("a = (1 << 0) => "); a = (1 << 0); printChar2Bin(a);
printf("\n"); printf("a = (1 << 1) => "); a = (1 << 1); printChar2Bin(a);
printf("\n"); printf("a = (1 << 2) => "); a = (1 << 2); printChar2Bin(a);
printf("\n"); printf("a = (1 << 3) => "); a = (1 << 3); printChar2Bin(a);
printf("\n"); printf("a = (1 << 4) => "); a = (1 << 4); printChar2Bin(a);
printf("\n"); printf("a = (1 << 5) => "); a = (1 << 5); printChar2Bin(a);
printf("\n"); printf("a = (1 << 6) => "); a = (1 << 6); printChar2Bin(a);
printf("\n"); printf("a = (1 << 7) => "); a = (1 << 7); printChar2Bin(a);
return 1; } |
Result :------------------------------
a (Dec) => 100
a (Bin) => 01100100 // this existing value does not affect any of the following operation
a = (1 << 0) => 00000001
a = (1 << 1) => 00000010
a = (1 << 2) => 00000100
a = (1 << 3) => 00001000
a = (1 << 4) => 00010000
a = (1 << 5) => 00100000
a = (1 << 6) => 01000000
a = (1 << 7) => 10000000
|
#include <stdio.h>
void printInt2Bin(int a) { int i,n;
n = sizeof(int)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
void printChar2Bin(int a) { int i,n;
n = sizeof(char)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
int main() {
char a = 100;
printf("a (Dec) => %d\n",a); printf("a (Bin) => "); printChar2Bin(a);
printf("\n"); printf("a = (1 << 0) => "); a = ~(1 << 0); printChar2Bin(a);
printf("\n"); printf("a = (1 << 1) => "); a = ~(1 << 1); printChar2Bin(a);
printf("\n"); printf("a = (1 << 2) => "); a = ~(1 << 2); printChar2Bin(a);
printf("\n"); printf("a = (1 << 3) => "); a = ~(1 << 3); printChar2Bin(a);
printf("\n"); printf("a = (1 << 4) => "); a = ~(1 << 4); printChar2Bin(a);
printf("\n"); printf("a = (1 << 5) => "); a = ~(1 << 5); printChar2Bin(a);
printf("\n"); printf("a = (1 << 6) => "); a = ~(1 << 6); printChar2Bin(a);
printf("\n"); printf("a = (1 << 7) => "); a = ~(1 << 7); printChar2Bin(a);
return 1; } |
Result :----------------------------
a (Dec) => 100
a (Bin) => 01100100 // this existing value does not affect any of the following operation
a = (1 << 0) => 11111110
a = (1 << 1) => 11111101
a = (1 << 2) => 11111011
a = (1 << 3) => 11110111
a = (1 << 4) => 11101111
a = (1 << 5) => 11011111
a = (1 << 6) => 10111111
a = (1 << 7) => 01111111
|
#include <stdio.h>
void printInt2Bin(int a) { int i,n;
n = sizeof(int)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
void printChar2Bin(int a) { int i,n;
n = sizeof(char)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
int main() {
char a = 100;
printf("a (Dec) => %d\n",a); printf("a (Bin) => "); printChar2Bin(a);
printf("\n"); printf("a | (1 << 0) => "); printChar2Bin(a | (1 << 0));
printf("\n"); printf("a | (1 << 1) => "); printChar2Bin(a | (1 << 1));
printf("\n"); printf("a | (1 << 2) => "); printChar2Bin(a | (1 << 2));
printf("\n"); printf("a | (1 << 3) => "); printChar2Bin(a | (1 << 3));
printf("\n"); printf("a | (1 << 4) => "); printChar2Bin(a | (1 << 4));
printf("\n"); printf("a | (1 << 5) => "); printChar2Bin(a | (1 << 5));
printf("\n"); printf("a | (1 << 6) => "); printChar2Bin(a | (1 << 6));
printf("\n"); printf("a | (1 << 7) => "); printChar2Bin(a | (1 << 7));
return 1; } |
Result :----------------------------------
a (Dec) => 100
a (Bin) => 01100100
a | (1 << 0) => 01100101
a | (1 << 1) => 01100110
a | (1 << 2) => 01100100
a | (1 << 3) => 01101100
a | (1 << 4) => 01110100
a | (1 << 5) => 01100100
a | (1 << 6) => 01100100
a | (1 << 7) => 11100100
|
#include <stdio.h>
void printInt2Bin(int a) { int i,n;
n = sizeof(int)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
void printChar2Bin(int a) { int i,n;
n = sizeof(char)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
int main() {
char a = 100;
printf("a (Dec) => %d\n",a); printf("a (Bin) => "); printChar2Bin(a);
printf("\n"); printf("a & ~(1 << 0) => "); printChar2Bin(a & ~(1 << 0));
printf("\n"); printf("a & ~(1 << 1) => "); printChar2Bin(a & ~(1 << 1));
printf("\n"); printf("a & ~(1 << 2) => "); printChar2Bin(a & ~(1 << 2));
printf("\n"); printf("a & ~(1 << 3) => "); printChar2Bin(a & ~(1 << 3));
printf("\n"); printf("a & ~(1 << 4) => "); printChar2Bin(a & ~(1 << 4));
printf("\n"); printf("a & ~(1 << 5) => "); printChar2Bin(a & ~(1 << 5));
printf("\n"); printf("a & ~(1 << 6) => "); printChar2Bin(a & ~(1 << 6));
printf("\n"); printf("a & ~(1 << 7) => "); printChar2Bin(a & ~(1 << 7));
return 1; } |
Result :----------------------------------
a (Dec) => 100
a (Bin) => 01100100
a & ~(1 << 0) => 01100100
a & ~(1 << 1) => 01100100
a & ~(1 << 2) => 01100000
a & ~(1 << 3) => 01100100
a & ~(1 << 4) => 01100100
a & ~(1 << 5) => 01000100
a & ~(1 << 6) => 00100100
a & ~(1 << 7) => 01100100
|
#include <stdio.h>
void printInt2Bin(int a) { int i,n;
n = sizeof(int)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
void printChar2Bin(int a) { int i,n;
n = sizeof(char)*8;
for(i=n-1;i>=0;i--) { printf("%d",(a >> i) & 1); if(i % 8 == 0) printf(" "); }
}
int main() {
char a = 100;
printf("a (Dec) => %d\n",a); printf("a (Bin) => "); printChar2Bin(a);
printf("\n"); a = (1 << 5) | (1 << 3) | (1 << 0); printf("(1 << 5) | (1 << 3) | (1 << 0) => "); printChar2Bin(a);
return 1; } |
Result :-----------------
a (Dec) => 100
a (Bin) => 01100100
(1 << 5) | (1 << 3) | (1 << 0) => 00101001 // Set the bits 0,3,5 to be '1'
// and set all other bits to be '0'
// regardless of the existing value