我是靠谱客的博主 能干咖啡,这篇文章主要介绍位运算:按位与、按位或、按位异或、按位左移、按位右移一、基础知识补充二、位运算三、位运算例题四、共勉,现在分享给大家,希望可以做个参考。

目录

一、基础知识补充

    (1)位运算

    (2)二进制的详细操作

二、位运算

    (1)按位与(&)

    (2)按位或(|)

    (3)按位异或(^)

      (4)按位左移(<<)

    (5)按位右移(>>)

三、位运算例题

    题目描述:

    题解:

四、共勉


一、基础知识补充

    (1)位运算

    位运算符要比一般的算术运算符速度要快,而且可以实现一些算术运算不能实现的功能(文章后面会举例子)。如果在完成代码的时候需要做到开发效率高,位运算是必不可少的。位运算用来对二进制位进行操作,包括:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、按位左移(<<)、按位右移(>>) 。

    (2)二进制的详细操作

    在进行位运算的时候,会用到大量的二进制源码、反码、补码,所以有需要的朋友可以看看我的上一篇文章哦!!!

    文章的链接:  http://t.csdn.cn/dasNJ

二、位运算

    (1)按位与(&)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:将整数从十进制转化为二进制数,上下比较,有零则零 ,两个都是 1 才是 1。

    3. 运算编码:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例:将 3 & (-5)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
// int 为整型4个字节有32个bit位 int a = 3 ; // 00000000 00000000 00000000 000000011 正数,源码=反码=补码 int b = -5 ; // 10000000 00000000 00000000 000000101 -5的源码 // 11111111 11111111 11111111 111111010 -5的反码 // 11111111 11111111 11111111 111111011 -5的补码 int c = a & b ; //按位与:上下比较,有零则零,两个都为 1 才是 1 // 00000000 00000000 00000000 00000011 3的补码 // 11111111 11111111 11111111 11111011 -5的补码 最终结果// 00000000 00000000 00000000 00000011 ----(3)整数,源码=反码=补码

    (2)按位或(|)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:上下比较有 1 则为 1,两个都是 0 才是 0

    3. 运算编码:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例:3 |  (-5)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// int 为整型有4个字节,32个bit位 int a = 3 ; // 00000000 00000000 00000000 00000011 正数,源码=反码=补码 int b = -5 ; // 10000000 00000000 00000000 00000101 -5的源码 // 11111111 11111111 11111111 11111010 -5的反码 // 11111111 11111111 11111111 11111011 -5的补码 int c = a | b ; //按位或:上下比较,有 1 则 1,两个都是 0 才是 0 // 11111111 11111111 11111111 11111011 -5的补码 // 00000000 00000000 00000000 00000011 3的补码 最终结果// 11111111 11111111 11111111 11111011 为负数,是补码 // 11111111 11111111 11111111 11111010 是反码,补码-1 // 10000000 00000000 00000000 00000101 是源码,各个位按位取反-----(-5)

    (3)按位异或(^)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:上下比较,相同为 0 ,相异为 1 

    3. 运算编码:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例: 3  ^ (-5)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// int 为整型有4个字节32个bit位 int a = 3 ; // 00000000 00000000 00000000 00000011 正数,源码=反码=补码 int b = -5 ; // 10000000 00000000 00000000 00000101 负数,(-5)的源码 // 11111111 11111111 11111111 11111010 -5的反码 // 11111111 11111111 11111111 11111011 -5的补码 int c = a ^ b ; //按位异或:上下比较,相同为0,相异为1 // 11111111 11111111 11111111 11111011 -5的补码 // 00000000 00000000 00000000 00000011 3的补码 //异或 :11111111 11111111 11111111 11111000 负数,补码 // 11111111 11111111 11111111 11110111 反码 // 10000000 00000000 00000000 00001000 源码-----(-8)

      (4)按位左移(<<)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:把二进制数向左移动一位,左边溢出的丢弃,右边补零

    3. 编码运算:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例:将 a = 4 左移一位

复制代码
1
2
3
4
// int 为整型,有4个字节,32个bit位 int a = 4 ; // 00000000 00000000 00000000 00000100,正数,源码=反码=补码 int b = a << 1 ; // 把a左移一位,左边丢弃,右边补零 // 00000000 00000000 00000000 00001000 ----(8)

    (5)按位右移(>>)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:把二进制数向右移动一位,右边丢弃,左边补原符号位

    3. 编码运算:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

复制代码
1
2
3
4
5
6
7
int a = -4 ; // 10000000 00000000 00000000 00000100 负数,源码 // 11111111 11111111 11111111 11111011 -4的反码 // 11111111 11111111 11111111 11111100 -4的补码 int b = >> 1 ; // 把b向右移动一位,右边丢弃,左边补原符号位 // 11111111 11111111 11111111 11111110 负数,补码 // 11111111 11111111 11111111 11111101 反码 // 10000000 00000000 00000000 00000010 源码----(-2)

    此时我们可以发现一个整数,左移有乘2的效果,右移有除二的效果。

三、位运算例题

    题目描述:

    不创建第三变量,进行变量 a , b 的数值交换

    题解:

    (方法一):简单数位运算,但是不能满足所有需求

复制代码
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h> int main() { int a = 5; int b = 3; a = a + b; b = a - b; a = a - b; printf("a=%d b=%dn", a, b); return 0; }

    若 a , b 两个数相加的和刚好超过 int 的取值范围,方法一就不可行。

    (方法二):位运算,简单,高效

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//找规律 //3^3=0 //5^5=0 //3^5^5=3 //3^5^3=5 //3^5=6 // 异或支持交换律 #include <stdio.h> int main() { int a = 8; int b = 9; int z; z = a ^ b; //设置密码z b = z ^ b; //b=a^b^b=a a = z ^ a; //a=a^b^a=b printf("a=%d b=%dn", a, b); return 0; }

四、共勉

    这篇文章就是我对位运算的理解,如果大家有什么问题可以在评论区说出来哦,我们共同进步,一起加油!!!

 

最后

以上就是能干咖啡最近收集整理的关于位运算:按位与、按位或、按位异或、按位左移、按位右移一、基础知识补充二、位运算三、位运算例题四、共勉的全部内容,更多相关位运算内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(109)

评论列表共有 0 条评论

立即
投稿
返回
顶部