高级操作符——位操作符讲解(移位操作符~ 按位与''操作符~ 按位或'|'操作符~ 按位异或'^'操作符)
首先介绍操作符与位操作符的区别,位操作是程序设计中对位模式按位或二进制数的一元和二元操作。
在许多的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多。
有时候合理利用一个位操作符,可以帮助我们少些十几行代码。
一个最常见的:
(exp1)? exp2:exp3
移位操作符。
左移位操作符。
<<
将二进制序列左边抛弃,右边补0;
如:
int i=1;
00000000000000000000000000000001
i<<1;
00000000000000000000000000000010
右移位操作符。
>>
如同左移位操作符但又有不同。
如果该数为负数则右边抛弃,左边补1。
如果该数为正数则右边抛弃,左边补0。
接下来的按位操作符放一起讲。
按位与“&”:俩个二进制序列同一位上都是1则为1,其余为零。
按位或"|":俩个二进制序列同一位上有1则为1,其余为零。
按位异或“^”:俩个二进制序列同一位上都是1则为零。
知道安位操作符的性质,我们不妨写一些代码来看看他们具体有什么作用。
1. 不允许创建临时变量,交换两个整数的内容
#define _CRT_SECURE_NO_WARINGS 1
#include <stdio.h>
int main()
{int a = 3;int b = 5;a = a + b;//方法一b = a - b;a = a - b;printf("a=%d b=%d\n", a, b);a = 3;b = 5;a = a^b;//方法二,按位异或,该方法执行效率更好b = a^b;a = a^b;printf("a=%d b=%d\n", a, b);return 0;
}
运行结果:
2. 写一个函数返回参数二进制中 1 的个数。
例如: 15 0000 1111 4 个 1
#include<stdio.h>
int sum_bit_1(unsigned int n);//方法一
int sum_bit_2(unsigned int n);//方法二
int sum_bit_3(unsigned int n);//方法三
int main()
{int n = 0;int ret1 = 0;int ret2 = 0;int ret3 = 0;printf("输入要求的数\n");scanf_s("%d", &n);ret1=sum_bit_1(n);//接受返回来的1的个数ret2=sum_bit_2(n);ret3=sum_bit_3(n);printf("ret1=%d\n", ret1);printf("ret2=%d\n", ret2);printf("ret3=%d\n", ret3);return 0;
}
int sum_bit_1(unsigned int n)
{int count = 0;while (n)//只要是非零就可进入循环{if (n % 2 == 1)count++;n = n / 2;}return count;
}
int sum_bit_2(unsigned int n)
{int count = 0;int i = 0;for (i = 0; i < 32;i++)//将32个比特位依次右移{if (((n >>i)& 1) == 1)//与1进行相与看不懂可自行写二进制序列{count++;}}return count;
}
int sum_bit_3(unsigned int n)
{int count = 0;while (n){n=n&(n - 1);//按位与的非常有用的一个性质,与他本身小一相与一次其二进制序列数少一个1count++;}return count;
}
运行结果:
阅读代码可知,sum-bit_1用的是普通函数,sum_bit_2用的his移位操作符,sum_bit_3用的是按位异或操作符。
我们分析其时间复杂度和空间复杂度可知,一方法为n次,二方法为32次,三方法为二进制序列有多少个1执行多少次。所以方法三不管在时间复杂度还是空间复杂度都优于方法一和二。
4. 编程实现:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
#include<stdio.h>
int main()
{int n = 0;int m = 0;int i = 0;int count = 0;printf("输入俩个整数\n");scanf_s("%d%d", &m, &n);for (i = 0; i < 32; i++){if (((m >> i) & 1) != ((n >> i) & 1))count++;}printf("不同比特位的数目为:%d\n", count);return 0;
}
运行结果:
高级操作符——位操作符讲解(移位操作符~ 按位与''操作符~ 按位或'|'操作符~ 按位异或'^'操作符)相关推荐
- 位运算中的按位与(),按位或(|),按位异或(^)
大家好,今天和大家分享的是位运算符中的按位与,按位或,按位异或. 首先先声明一下:参加位运算的两个数都要用二进制来表示. 一般给的数都是十进制,十进制转化为二进制的方法如下: 注意:如果给的是八进制, ...
- c语言 10进制 按位与,位运算小结(按位与、按位或、按位异或、取反、左移、右移)...
原标题:位运算小结(按位与.按位或.按位异或.取反.左移.右移) 位运算不管是在Java语言,还是在C语言中,或者其他语言,都是经常会用到的,所以本文也就不固定以某种语言来举例子了,原始点就从0.1开 ...
- 位运算(按位与、按位或|、按位异或^) 运算规则与实例
位运算(按位与.按位或.按位异或) 按位与运算符(&) 参加运算的两个数,按二进制位进行"与"运算. 运算规则:同为1,结果为1,否则为0,即 0 & 0= 0 , ...
- 位运算小结(按位与、按位或、按位异或、取反、左移、右移)
位运算小结(按位与.按位或.按位异或.取反.左移.右移) 位运算主要包括按位与(&).按位或(|).按位异或(^).取反(~).左移(<<).右移(>>)这几种,其中除 ...
- 位运算:按位与、按位或、按位异或、按位非(补码 反码)
原码 补码 反码 计算机中的符号数有三种表示方法:原码.补码.反码.这三种表示方法都由符号位和数值位两部分组成,符号位1表示负数,0表示正数. 二进制数在内存中是以补码的形式存放的.为了更好理解计算机 ...
- 位运算:按位与、按位或、按位异或、按位左移、按位右移
目录 一.基础知识补充 (1)位运算 (2)二进制的详细操作 二.位运算 (1)按位与(&) (2)按位或(|) (3)按位异或(^) (4)按位左移(<<) (5)按位右移(&g ...
- 按位与、按位或、按位异或、按位取反、按位左移、按位右移
位运算符比一般的算术运算符速度要快,而且可以实现一些算术运算符不能实现的功能.如果要开发高效率程序,位运算符是必不可少的.位运算符用来对二进制位进行操作,包括:按位与(&).按位或(|).按位 ...
- 位操作符(按位与,按位或,按位异或)
//整型变量的存储方式以及位运算均以补码方式进行:(正数原码反码补码均相同) 例如:-13 原码:10001101(原码的第一位表示符号位:1表示负数,0表示正数) 反码:11110010(符号位不变 ...
- 位操作符【左移、右移、按位取反、按位与、按位或、按位异或】【详解】
本期介绍
- 位运算(按位与 、按位或、按位异或、取反、左移右移)
位运算 与(&) 0&0=0 0&1=0 1&0=0 1&1=1 或(|) 0|0=0 0|1=1 1|0=1 1|1=1 异或(^) 0^0=0 0^1=1 ...
最新文章
- java连连看(GUI)
- 怎么转换html格式文件怎么打开,html格式怎么转换
- c语言如何设置c99标准,新的C语言: C99标准介绍
- Java基础--通过反射获取私有的成员方法示例代码
- html如何使文本变为粗体_javascript – 如何使用节点和.createElement(“b”)使文本变为粗体?...
- Linux下内存问题检测神器 valgrind
- 光伏电站清扫机器人_轻型光伏电站清扫机器人的制作方法
- 201621123080《Java程序设计》第十一周学习总结
- Linux上传文件和下载文件命令行方式
- java html5 上传_HTML5结合ajax实现文件上传以及进度显示
- 生成 oracle 连接串,Generator连接Oracle数据库生成Model报错
- vue+elementUI的el-form的回车键登录
- eclipse中出现代码覆盖的颜色信息,如何去掉
- 《全局光照技术》在摩点网发起众筹活动
- php文件同名怎么办,php根据文件不同关闭同名进程
- 数据分析实战项目:SQL分析淘宝用户行为
- VSTO之一:Word外接程序
- roboware studio安装
- 遗传算法求解多约束、多类型车辆、多目标优化的车辆路径问题
- openwrt校园网自动登录且断网重连