二进制的位运算详解

位运算:

优先级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;
}


 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值