二进制的位运算详解

来源:互联网 发布:域名分为几部分 编辑:程序博客网 时间:2024/05/16 03:34

位运算:

优先级8-10等 次于等于判断符和加减运算,优于逻辑与非

一.按位与运算

符号表示: “&”

运算过程:

①   将数转化为二进制(实际机器操作中本身就是二进制,这里的意思是人工计算)

②   每一位都进行如下运算:

a)      1与1与运算得1

b)      1与0(0与1)与运算得0

c)       0与0与运算得0

两个数按位进行或运算特点有:

1.     多个相同数进行与运算等于其本身

2.     多个数进行按位与运算结果小于等于其中最小值

3.     左结合性

4.     优先级在位运算中最高。

 

样例:

1&1 = 1

1&2 = 0

1&2&1 = 0

 

代码示范:

#include <stdio.h>int main() {    int n;    while (scanf("%d", &n) != EOF) {        int a;        scanf("%d", &a);        int temp = a;//注意这里直接把第一个数作为初值        for (int i = 1; i < n; ++i) {            scanf("%d", &a);            temp = temp & a;        }        printf("%d\n", temp);    }    return 0;}


 特殊应用:1&n   对于n为偶数结果是0,n为奇数结果是1,可用于判断奇偶。


二.按位或运算

符号表示:  “|”

运算过程:

③   将数转化为二进制(实际机器操作中本身就是二进制,这里的意思是人工计算)

④   每一位都进行如下运算:

a)      1与1或运算得1

b)      1与0(0与1)或运算得1

c)       0与0或运算得0

 

两个数按位进行或运算特点有:

5.     多个相同数进行或运算等于其本身

6.     多个数进行按位或运算结果大于等于其中最大值

7.     左结合性

8.     优先级低于按位异或和按位与。

 

样例:

1|1 = 0

1|2 = 3

2|2 = 2

1|1|1 = 1

1|2|1 = 3

代码示范:

 

#include <stdio.h>int main() {    int n;    while (scanf("%d", &n) != EOF) {        int temp = 0;        int a;        for (int i = 0; i < n; ++i) {            scanf("%d", &a);            temp = temp | a;        }        printf("%d\n", temp);    }    return 0;} 

三.非运算

表示方法: “~” (键盘左上角)

运算法则为:

a)     1按位非为0

b)    0按位非为1

大小不一定,优于按位或,次于按位与

样例(二进制):

~1 = 0

~0=1

~10010=01101

样例(64位int型):

~1 = -2

~2 = -3

~-1 = 0

~0 = -1

注: int中第一位为符号位,以补码形式保存,0比较特殊它的补码的二进制为1000,0000,0000,0000所以会产生这种结果。

 

代码示范:

#include <stdio.h>int main() {    int n;    while (scanf("%d", &n) != EOF) {        printf("%d\n", ~n);    }    return 0;} 
 

四.按位异或

符号表示: “^”

运算法则:

①   每位转换为二进制

②   每一位都进行如下运算:

a)      0 ^ 0 = 0

b)      0 ^ 1 = 1

c)       1 ^ 0 = 1

d)      1 ^ 1 = 0

特点

1.     对偶数个相同数字进行按位异或运算得到0

2.     对奇数个相同数字进行按位异或运算得到1

3.     对两个不同数字进行运算相当于加号

4.     对多个不同数字结果无规律

5.     左结合性

 

样例:

1 ^ 2 = 3

1 ^ 1 = 0

1 ^ 1 ^ 1 = 1

2 ^ 2 ^ 2 = 2

1 ^ 2 ^ 3 = 0

 

示例代码:

#include <stdio.h>int main() {    int n;    while (scanf("%d", &n) != EOF) {        int a;        scanf("%d", &a);        int temp = a;        for (int i = 1; i < n; ++i) {            scanf("%d", &a);            temp = temp ^ a;        }        printf("%d\n", temp);    }    return 0;}