一、移位操作符

<<   >>

在介绍移位操作符前先学习一下二进制的表示方法,二进制表示方法有3种:

原码,反码,补码

正数原码,反码,补码相同

负数原码,反码,补码需要计算

例子:5的二进制码

0000 0000 0000 0000 0000 0000 0000 0101        原码

0000 0000 0000 0000 0000 0000 0000 0101        反码

0000 0000 0000 0000 0000 0000 0000 0101        补码

第一位数表示正负。0为正数,1为负数。

-5的二进制码

1000 0000 0000 0000 0000 0000 0000 0101        原码

1111  1111  1111  1111 1111  1111  1111  1010        反码 (符号位不变,其他位按位取反)

1111  1111  1111  1111 1111  1111  1111  1011        补码(最后一位+1)

整数在内存中存的是二进制的补码。回到移位操作符。

左移

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main()
{int a = 5;
//5的补码     0000 0000 0000 0000 0000 0000 0000 0101 a = a<< 1;printf("%d", a);return 0;
}

上段代码将 5 的补码左移一位,再最后一位补上0

此时二进制补码变成了 2³+2=8+2=10 。

输出结果

10

这次对-5左移一位

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main()
{int a = -5;//-5 的补码1111  1111  1111  1111 1111  1111  1111  1011a = a<< 1;printf("%d", a);return 0;
}

打印时,将打印原码,因此会先将补码转成原码。正数因为源反补都相同,不需要再换算。

计算发现 -5左移1位原码就是 - (2³+2)= -10 ,打印结果自然也是-10接下来介绍右移,右移分为算术右移和逻辑右移。

右移

算术右移:右边丢弃,左边补符号位

逻辑右移:右边丢弃,左边补0

+5 -5 的原反补码及 对补码算术右移1位并转为原码

 截图时截少了,左边的0没截到

代码:

   int a = -5;a = a >> 1;printf("%d", a);

结果:

-3

右移运算是算术还是逻辑右移,是取决于编译器的,此次结果表明当前编译器采用的是算术右移

不是-2的结果也说明不能用移位运算取代 "/2" 运算。

注意:无法移动负数位,标准里未定义。

a>>>-1 //error

二、 位操作符

        | & ^ ~

&按位与:类似且的逻辑,二进制按位运算,前后两个运算数同时为“1”得“1”。

| 按位或:前后两个运算数只要其一为“1”,结果就为“1”。

^按位异或:前后两个运算数相同为0,相异为1。

~按位取反:对一个数的二进制按位取反。

& 按位与

程序

    int a = -3;int b = 5;int c = a & b;printf("%d", c);

同样先算出a,b的补码

    a=-3,b=5a 10000000000000000000000000000011 原a 11111111111111111111111111111100 反a 11111111111111111111111111111101 补b 00000000000000000000000000000101 补

按位与 a&b,每位两者都为1,才得1,否则0, 得:

   a 11111111111111111111111111111101 补b 00000000000000000000000000000101 补c 00000000000000000000000000000101 补

因为打印时会打印原码,这里再将补码转为原码,即:

   因为c为正数所以正反补都相同c 00000000000000000000000000000101 补c 00000000000000000000000000000101 反c 00000000000000000000000000000101 原

运行结果

5

|位或

同理

程序

    int a = -3;int b = 5;int c = a | b;printf("%d", c);

运行结果

-3

^ 按异或

相同为0,相异为1。

程序

void test4() {int a = -3;int b = 5;int c = a ^ b;printf("%d", c);
}

运算过程

    a=-3,b=5a 10000000000000000000000000000011 原↓a 11111111111111111111111111111100 反↓a 11111111111111111111111111111101 补b 00000000000000000000000000000101 补c 11111111111111111111111111111000 补//异或运算:相同为0,相异为1↓ 转原码打印c 11111111111111111111111111110111 反c 10000000000000000000000000001000 原//对应十进制的-8

运行结果

-8

异或特殊的两种用法,任何数与0异或是它本身;任何数与它本身异或是0。

程序

   int a = 3;printf("%d\n", a ^ 0);printf("%d", a ^ a);

运行结果

3
0

运算过程

                 相同取0 相异取1a   000000000000000000000000000000000011 //原a   111111111111111111111111111111111100 //反a   111111111111111111111111111111111101 补0   000000000000000000000000000000000000 补
a^0  111111111111111111111111111111111101 补a   111111111111111111111111111111111101 补a   111111111111111111111111111111111101 补
a^a  000000000000000000000000000000000000 补

可以发现a^0=a,a^a=0 。由此又延伸出一种很常用的算法,异或一组数据就能得到其中不成对的数字。

对1234321这组数据异或

        1^2^3^4^3^2^1=4

成对的数字相抵消为0,最后剩下一个4与0异或,就是4本身。

这里能听懂,那这道题对你来说那必是轻而易举(~ ̄▽ ̄)~力扣

有了这样的基础,你甚至能拿两个变量做更nb的操作——无需第三个变量就能交换两个变量的值

   int a = 3;int b = 5;a = a ^ b;b = a ^ b;//此时a = a ^ b;a = a ^ b;//此时b=a^b^b =a,也就是a =a^b^a 最终等于bprintf("a=%d b=%d", a, b);

运行结果

a=5 b=3

当然这里也可以用求和的方式实现交换,但这种方法有缺陷的,当a ,b的值非常大时,他们的和就会溢出,最终得不到想要的值,算权宜之计。

~  按位取反

将补码全部取反,打印的时候同样要转换成原码打印。

1.下面的程序将二进制某位从0变成1又从1变成0,1变成0的运算用到“~”取反,具体过程看注释。

000000000000000000000000000000001011 ↓            ↑目标位
000000000000000000000000000000001111↓            ↑目标位
000000000000000000000000000000001011

程序

    //~取反//000000000000000000000000000000001011int a = 11;a |= (1 << 2);//对1左移2位//000000000000000000000000000000001011     a//000000000000000000000000000000000100   (1 << 2)//000000000000000000000000000000001111  进行位或运算得到结果printf("变形:%d\n", a);a &= ~(1 << 2);//000000000000000000000000000000001011      a//111111111111111111111111111111111011   ~(1 << 2)//000000000000000000000000000000001011  进行位与运算得到结果printf("还原:%d\n", a);

运行结果

变形:15
还原:11

2. 可以用来终止获取输入  while(~scanf() )

        scanf 读取失败时返回 -1,而-1的补码是32/64位1,取反后为0,即返回假,所以条件终止。

-1    1111 1111 1111 1111 1111 1111 1111 11110    0000 0000 0000 0000 0000 0000 0000 0000 

-看到这里应该懂了8,希望本文能帮助你理解位、移位操作符

-什么?你说还不懂(*゜ー゜*)

-欢迎在评论区留言问题~

不懂异或?一文详解移位操作符,位操作符相关推荐

  1. 一文详解JavaBean 看这篇就够了

    一文详解JavaBean 看这篇就够了 JavaBean的历史渊源 JavaBean的定义(通俗版) JavaBean应用 < jsp:useBean > < jsp:getProp ...

  2. 【卷积神经网络结构专题】一文详解AlexNet(附代码实现)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]本文是卷积神经网络结构系列专题第二篇文章,前面我们已经介绍了第一个真正意义 ...

  3. 一文详解 YOLO 2 与 YOLO 9000 目标检测系统

    一文详解 YOLO 2 与 YOLO 9000 目标检测系统 from 雷锋网 雷锋网 AI 科技评论按:YOLO 是 Joseph Redmon 和 Ali Farhadi 等人于 2015 年提出 ...

  4. 一文详解决策树算法模型

    AI有道 一个有情怀的公众号 上文我们主要介绍了Adaptive Boosting.AdaBoost演算法通过调整每笔资料的权重,得到不同的hypotheses,然后将不同的hypothesis乘以不 ...

  5. 「软件项目管理」一文详解软件配置管理计划

    一文详解软件配置管理计划 前言 一.配置管理概述 1. 配置管理(SCM)定义 2. 软件配置项目(SCI) 3. 基线 4. 软件配置控制委员会(SCCB) 二.软件配置管理过程 1. 管理过程 2 ...

  6. 「软件项目管理」一文详解软件项目质量计划

    一文详解软件项目质量计划

  7. 「软件项目管理」一文详解软件项目管理概述

    一文详解软件项目管理概述

  8. OpenCV-Python实战(12)——一文详解AR增强现实

    OpenCV-Python实战(12)--一文详解AR增强现实 0. 前言 1. 增强现实简介 2. 基于无标记的增强现实 2.1 特征检测 2.2 特征匹配 2.3 利用特征匹配和单应性计算以查找对 ...

  9. Python-Matplotlib可视化(10)——一文详解3D统计图的绘制

    Python-Matplotlib可视化(10)--一文详解3D统计图的绘制 前言 3D散点图 3D曲线图 3D标量场 绘制3D曲面 在3D坐标轴中绘制2D图形 3D柱形图 系列链接 前言 Matpl ...

最新文章

  1. Angular - - $sce 和 $sceDelegate
  2. java高效代码_Java工程师该如何编写高效代码?
  3. Objetive-C枚举位移操作Swift枚举位移操作
  4. 二分类最优阈值确定_机器学习 | 详解GBDT在分类场景中的应用原理与公式推导...
  5. redis 主从配置_Laravel 使用Redis缓存集群,主从集群配置就这么简单?
  6. Android Json解析与总结
  7. 【CF1311E】Construct the Binary Tree【增量构造】【复杂度证明】
  8. Oracle的 EXEC SQL CONTEXT学习
  9. GB-T2260-2020 <中华人民共和国县以上行政区划代码>
  10. PHP获取客户端IP的方法
  11. 5, Swift tableView点击收起展开的效果
  12. python爬虫-斗鱼弹幕(asyncore仅供学习参考用)
  13. 互联网日报 | 1月30日 星期六 | 苹果单季营收首破1000亿美元;特斯拉连续六个季度盈利;全球新冠肺炎确诊病例超1亿例...
  14. formidable词根词缀_托福词汇-重点词根词缀总结(二)
  15. shell蚂蚁森林_和“蚂蚁森林”的融合
  16. python-破译密码
  17. python调用photoshop_Python和Photoshop
  18. 黑色渐变背景css,css-渐变背景,爱了爱了。
  19. 统计学习理论(SLT)与支持向量机(SVM)
  20. misc1-图片隐写

热门文章

  1. 转载:关于调制比、过调制、基波电压和母线电压的概念和关系总结
  2. 使用 SendARP 获取 MAC 地址
  3. IDAE Keystore was tampered with报错解决
  4. 网易云音乐 DBA 谈 TiDB 选型:效率的选择
  5. jmeter 录制--https代理证书导入IOS手机
  6. 借助nginx实现反向代理,并通过SSL证书实现https访问以及http调整https访问。
  7. Matlab解五次以上方程,大侠帮忙,matlab解方程组 (5个方程,5个未知数)
  8. linux笔记本触屏方向反了,[已解决]如何设置触摸板上下滚屏反转(像mac一样,和windows是反的)...
  9. HashMap什么时候出现红黑树
  10. 一次RAC主机资源使用异常导致的节点重启