【C语言之】二进制的四种位运算:取反、与、或、异或
【C语言之】二进制的四种位运算:取反、与、或、异或。位运算示例。
·
【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;
}
//----- ~&|^ -----//
更多推荐
所有评论(0)