【C语言之】二进制的四种位运算:取反、与、或、异或

1、按位取反运算( bit not : ~ )

  • 对操作数的每一位执行逻辑取反操作,即将每一位的 0 变为 1,1 变为 0。
  • 取反运算符,按二进制位进行"取反"运算。运算规则:
  s1:  ~ 0  ===> 1
  s2:  ~ 1  ===> 0
  • 示例如下:
  ~ 1001 0110
---------------
    0110 1001

2、按位与运算( bit and : & )

  • 对两个操作数的每一位执行逻辑与操作,如果两个相应的位都为 1,则结果为 1,否则为 0。
  • 按位与操作,按二进制位进行"与"运算。运算规则:
  s1:  0 & 0 ===> 0
  s2:  1 & 0 ===> 0
  s3:  0 & 1 ===> 0
  s4:  1 & 1 ===> 1
  • 示例如下:
    0100 1101
  & 0011 0101
---------------
    0000 0101

3、按位或运算( bit or : | )

  • 对两个操作数的每一位执行逻辑或操作,如果两个相应的位都为 0,则结果为 0,否则为 1。
  • 按位或运算符,按二进制位进行"或"运算。运算规则:
  s1:  0 | 0  ===> 0
  s2:  0 | 1  ===> 1
  s3:  1 | 0  ===> 1
  s4:  1 | 1  ===> 1
  • 示例如下:
    0100 1101
  | 0011 0101
---------------
    0111 1101

4、按位异或运算( bit xor : ^ )

  • 对两个操作数的每一位执行逻辑异或操作,如果两个相应的位值相同,则结果为 0,否则为 1。
  • 异或运算符,按二进制位进行"异或"运算。运算规则:
  s1:  0 ^ 0  ===> 0
  s2:  0 ^ 1  ===> 1
  s3:  1 ^ 0  ===> 1
  s4:  1 ^ 1  ===> 0
  • 示例如下:
    0100 1101
  ^ 0011 0101
---------------
    0111 1000

5、保留字节的某些位

  • 保留字节的后四位,与0x0F按位与即可,测试代码如下:
/* filename : wb.c */
#include <stdio.h>

/* get bits */
void
get_bits (void)
{
  char x = 0X5B;  //#b 0101 1010
  char f = 0X0F;  //#b 0000 1111
  char c = x & f; //#b 0000 1010
  printf ("Char x : [0X%02X]\n", x);
  printf ("Char f : [0X%02X]\n", f);
  printf ("bit AND ----------\n");
  printf ("Result : [0X%02X]\n", c);
}

/**/
int
main (int argc, char *argv[])
{
  get_bits ();
  return 0;
}
//----- ~&|^ -----//

6、编译运行,输出结果如下:

  • 达到预期,0x5B的后四位B保留了下来!
Char x : [0X5B]
Char f : [0X0F]
bit AND ----------
Result : [0X0B]

7、设置字节的某些位

  • 按位或某个数,相当于加上某个数,如按或0x06,相当于加上0x06,测试代码如下:
/* set bits */
void
set_bits (void)
{
  char x = 0X30;  //#b 0011 0000
  char f = 0X06;  //#b 0000 0110
  char c = x | f; //#b 0011 0110
  printf ("Char x : [0X%02X]\n", x);
  printf ("Char f : [0X%02X]\n", f);
  printf ("bit OR  ----------\n");
  printf ("Result : [0X%02X]\n", c);
}

8、编译运行,输出结果如下:

  • 达到预期,0x30的后四位加上了一个6!
Char x : [0X30]
Char f : [0X06]
bit OR  ----------
Result : [0X36]

9、按位异或常用来交换两个变量的值

  • 两个数进行两次异或操作,就能达到交换两个数的值的效果,代码如下:
/* swap a, b */
void
test_swap (void)
{
  char a = 0X70; //#b 0111 0000
  char b = 0X07; //#b 0000 0111
  printf ("before swap => a : [0X%02X], b : [0X%02X]\n", a, b);
  a = a ^ b;     //#b 0111 0111
  b = b ^ a;     //#b 0111 0000
  a = a ^ b;     //#b 0000 0111
  printf (" after swap => a : [0X%02X], b : [0X%02X]\n", a, b);
}

10、编译运行,输出结果如下:

  • 达到预期,a和b的值交换了!
before swap => a : [0X70], b : [0X07]
 after swap => a : [0X07], b : [0X70]

11、完整代码如下:

/* filename : wb.c */
#include <stdio.h>

/* swap a, b */
void
test_swap (void)
{
  char a = 0X70; //#b 0111 0000
  char b = 0X07; //#b 0000 0111
  printf ("before swap => a : [0X%02X], b : [0X%02X]\n", a, b);
  a = a ^ b;     //#b 0111 0111
  b = b ^ a;     //#b 0111 0000
  a = a ^ b;     //#b 0000 0111
  printf (" after swap => a : [0X%02X], b : [0X%02X]\n", a, b);
}

/* set bits */
void
set_bits (void)
{
  char x = 0X30;  //#b 0011 0000
  char f = 0X06;  //#b 0000 0110
  char c = x | f; //#b 0011 0110
  printf ("Char x : [0X%02X]\n", x);
  printf ("Char f : [0X%02X]\n", f);
  printf ("bit OR  ----------\n");
  printf ("Result : [0X%02X]\n", c);
}

/* get bits */
void
get_bits (void)
{
  char x = 0X5B;  //#b 0101 1010
  char f = 0X0F;  //#b 0000 1111
  char c = x & f; //#b 0000 1010
  printf ("Char x : [0X%02X]\n", x);
  printf ("Char f : [0X%02X]\n", f);
  printf ("bit AND ----------\n");
  printf ("Result : [0X%02X]\n", c);
}

/**/
int
main (int argc, char *argv[])
{
  test_swap ();
  //set_bits ();
  //get_bits ();
  return 0;
}
//----- ~&|^ -----//
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐