• 【操作符详解】之 移位操作符


    这篇文章详细讲解一下C语言中的移位操作符
    一起来学习吧!!!


    首先,给大家说明一点,移位操作符的操作数只能是整数,移位移动的是二进制位(当然整数在内存中存的是补码)。

    🌁 1.左移操作符(<<)

    首先我们来看左移操作符,<<:

    左移操作符的移位规则是:

    左边抛弃、右边补0

    我们来举个例子:

    #include 
    int main()
    {
    	int a = 10;
    	int b = a << 1;
    	printf("%d", b);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    大家可以按照上面的移动规则自己算一下,看看结果是什么。

    好,那现在我们一起来分析一下:
    在这里插入图片描述

    那结果是不是20 呢?我们来看一下:

    在这里插入图片描述

    另外提醒一下,对a进行移位之后,a在不被赋值的情况下(a=a<<1),a自身的值不会发生变化。

    我们可以打印一下看看:
    在这里插入图片描述

    好,刚才是对正数进行移位,我们再来移一个负数试试:

    int main()
    {
    	int a = -2;
    	int b = a << 1;
    	printf("%d", b);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    一起分析一下:

    在这里插入图片描述

    是-4吗?

    在这里插入图片描述

    做了两道题之后,我们好像可以发现一个规律:

    对整数左移一位,相当与乘了一个2:

    10左移一位结果是20;
    -2左移一位结果是-4;

    那左移操作符我们学会了,接下来我们来看右移操作符。

    ⛄️ 2.右移操作符(>>)

    对于右移操作符,它的移位规则分为两种:

    (1)算术右移

    右边丢弃,左边补原符号位

    上例子:

    int main()
    {
    	int a = -1;
    	int b = a >> 1;
    	printf("%d", b);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里给大家提一下,在我使用的vs2022这个编译器上采用的就是算术右移(大部分编译器都是算术右移)。

    那我们按照算术右移来分析一下结果是什么:

    在这里插入图片描述

    看看vs2022的结果:

    在这里插入图片描述
    整数算术右移一位相当于除以2并向下取整。(大家可以自己多试几个)

    这是算术右移,接着我们看逻辑右移。

    (2)逻辑右移

    右边丢弃,左边补0

    那还是这个代码:

    int main()
    {
    	int a = -1;
    	int b = a >> 1;
    	printf("%d", b);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    现在我们用逻辑右移来分析一下:

    在这里插入图片描述

    我们看看转换为10进制是几:
    在这里插入图片描述

    因为我们的编译器是算术右移,所以没法验证,大家知道就行了

    最后,再给大家提醒一点:
    在这里插入图片描述

    警告⚠ :

    对于移位运算符,不要移动负数位,这个是标准未定义的。

    比如:
    在这里插入图片描述

    最后呢要给大家说明一下:

    左移右移一定是向左、向右两个方向移动吗?
    左移其实是向高位移动,右移其实是向低位移动,只不过一般情况下左边就是高位,右边就是低位,所以起名为左移右移,符合我们的正常习惯。

    以上就是移位操作符的全部内容,欢迎大家指正!!!
    在这里插入图片描述

  • 相关阅读:
    【鸟哥杂谈】Linux环境下解决端口占用问题 Error: listen EADDRINUSE: address already in use :::8266
    面向对象编程(高级部分)——final关键字
    WebCPM:首个开源的交互式网页搜索中文问答模型
    001-使用docker desktop for mac
    解决:谷歌浏览器访问http时,自动转https访问的问题
    表单校验,日期比较
    13-ROS参数的学习与使用
    Vite 中怎么添加全局 scss 文件
    Tomcat下载安装以及配置(详细教程)
    B+tree - B+树深度解析+C语言实现+opencv绘图助解
  • 原文地址:https://blog.csdn.net/m0_70980326/article/details/126447281