https://www.sharetechnote.com/html/C_BitManipulation.html
我更喜欢C语言,在大多数情况下。然而,我对C语言不满意的是它没有太多的内置位操作功能。在大多数应用程序中,你可能不需要这种位操作,但如果你正在从事嵌入式系统编程或解析程序,你需要进行大量的位操作。在这个页面上,我将发布各种情况下操纵位和字节的技巧。这不是很难,但如果你不熟悉这些技巧,看起来会很混乱。我将继续添加这些位操作的示例,以便于你将其作为小型字典使用。
例句:
1. 以二进制格式打印数字
2. 移位二进制数
3. 取出特定位
4. 设置特定位(设为'1')并取消设置所有其他位(设为'0')
5. 取消设置特定位(设为'0')并设置所有其他位(设为'1')
6. 设置特定位(设为'1'),而不影响其他位
7. 取消设置特定位(设为'0'),而不影响其他位
8. 设置多个位(设为'1')并取消设置所有其他位(设为'0')
Example 1 > Printing Numbers in Binary Format
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
Example 2 > Shifting the binary number
#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
Example 3 > Take out a specific bit
#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
Example 4 > Setting a specific bit (set it to be '1') and Unsetting all other bits (set it to be '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
Example 5 > Unsetting a specific bit (set it to be '0') and Setting all other bits (set it to be '1')
#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
Example 5 > Setting a specific bit (set it to be '1') without affecting other bits
#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
Example 6 > Unsetting a specific bit (set it to be '0') without affecting other bits
#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
Example 7 > Setting multiple bit (set it to be '1') and Unsetting all other bits (set it to be '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");
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