C_BitManipulation.html

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值