C语言 移位操作符

  • << 左移操作符
  • >> 右移操作符

注:移位操作符的操作数只能是整数。

        移位操作符移动的是二进制位。

整数的二进制表示有3种:

  • 原码
  • 反码
  • 补码

正的整数的原码、反码、补码相同。

负的整数的原码、反码、补码是要计算的。

  • 由负整数原码计算出反码:原码的符号位不变,其他位按位取反
  • 由负整数反码计算出补码反码+1

示例:

7的原码、反码、补码:

  • 原码:0000 0000 0000 0000 0000 0000 0000 0111
  • 反码:0000 0000 0000 0000 0000 0000 0000 0111
  • 补码:0000 0000 0000 0000 0000 0000 0000 0111

-7的原码、反码、补码:

  • 原码:1000 0000 0000 0000 0000 0000 0000 0111
  • 反码:1111  1111  1111  1111  1111  1111  1111 1000   符号位不变,其他位按位取反
  • 补码:1111  1111  1111  1111  1111  1111  1111 1001   反码+1

        整数在内存中存的是补码。

        移位操作符移动的是存在内存中的补码。

1左移操作符

移位规则: 左边抛弃、右边补0。

正的整数左移示例:

        对7左移

补码:0000 0000 0000 0000 0000 0000 0000 0111

左移:0000 0000 0000 0000 0000 0000 0000 1110     

        左移后内存中存的还是补码,因为正整数的原码和补码相同,所以对7左移后的值十进制为14。

代码验证:

#include <stdio.h>int main()
{int a = 7 ;int b = a << 1;printf("a=%d\n", a);printf("b=%d\n", b);return 0;
}

运行结果:

a=7
b=14

        变量b得到了变量a左移1位之后的变化,但变量a自身是不变的。


负的整数左移示例:

        对-7左移

补码:1111  1111  1111  1111  1111  1111  1111 1001

左移:1111  1111  1111  1111  1111  1111  1111 0010

        左移后内存中存的还是补码,因为负整数的原码和补码之间需要计算。

  • 由负整数补码计算出反码补码-1
  • 由负整数反码计算出原码:反码的符号位不变,其他位按位取反

补码:1111  1111  1111  1111  1111  1111  1111 0010  (左移1位后)

反码:1111  1111  1111  1111  1111  1111  1111 0001    补码-1

原码:1000 0000 0000 0000 0000 0000 0000 1110     符号位不变,其他位按位取反。

        计算出-7左移后的值十进制为-14。

代码验证:

#include <stdio.h>int main()
{int a = -7 ;int b = a << 1;printf("a=%d\n", a);printf("b=%d\n", b);return 0;
}

运行结果:

a=-7
b=-14

        因为二进制数的每一位都是2的指数幂,所以左移1位后,只要没有发生数据溢出,值就会变为原来的2倍,如果变量为无符号整形或正整数,表达式 a << n 会将a的所有位左移n位,运算结果位a×2^{n}

2 右移操作符

移位规则:

  1. 逻辑移位:左边补0,右边丢弃。
  2. 算术移位:左边补原值的符号位,右边丢弃。(绝大多数编译器采用算术移位,所以示例都为算数移位结果)

正的整数右移示例:

        对7右移

补码:0000 0000 0000 0000 0000 0000 0000 0111

左移:0000 0000 0000 0000 0000 0000 0000 0011     

        右移后内存中存的还是补码,因为正整数的原码和补码相同,所以7左移后的值十进制为3。

代码验证:

#include <stdio.h>int main()
{int a = 7 ;int b = a >> 1;printf("a=%d\n", a);printf("b=%d\n", b);return 0;
}

运行结果:

a=7
b=3

负的整数右移示例:

        对-7右移

补码:1111  1111  1111  1111  1111  1111  1111 1001

左移:1111  1111  1111  1111  1111  1111  1111 1100

        右移后内存中存的还是补码,因为负整数的原码和补码之间需要计算。

  • 由负整数补码计算出反码补码-1
  • 由负整数反码计算出原码:反码的符号位不变,其他位按位取反

补码:1111  1111  1111  1111  1111  1111  1111 1100  (左移1位后)

反码:1111  1111  1111  1111  1111  1111  1111 1011    补码-1

原码:1000 0000 0000 0000 0000 0000 0000 0100     符号位不变,其他位按位取反。

        计算出-7右移后的值十进制为-4。

代码验证:

#include <stdio.h>int main()
{int a = -7 ;int b = a >> 1;printf("a=%d\n", a);printf("b=%d\n", b);return 0;
}

运行结果:

a=-7
b=-4

        因为二进制数的每一位都是2的指数幂,所以右移1位后,只要没有发生数据溢出,值就会变为原来的二分之一,如果变量为无符号整形或正整数,表达式 a >> n 会将a的所有位右移n位,运算结果位a÷2^{n}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/228220.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万界星空科技生产管理mes系统种的工艺确认流程

MES工艺流程是制造执行系统的核心部分&#xff0c;它涵盖了整个生产过程&#xff0c;包括物料管理、生产计划、生产执行、质量管理、维修保养等方面&#xff0c;可以有效地提高生产效率和产品质量。 一、确认追溯模型&#xff1a; 以工艺文件为确认对象&#xff0c;以产品生产…

景联文科技加入中国人工智能产业联盟(AIIA)数据委员会

近日&#xff0c;景联文科技加入中国人工智能产业联盟&#xff08;AIIA&#xff09;数据委员会&#xff0c;成为委员会成员单位。 中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;是在国家发改委、科技部、工信部、网信办指导下&#xff0c;由中国信息通信研究院等单…

Mybatis网址

Mybatis中文网&#xff1a;MyBatis中文网https://mybatis.net.cn/Mybatis Git 地址&#xff1a;MyBatis GitHubMyBatis has 37 repositories available. Follow their code on GitHub.https://github.com/mybatis

食谱菜谱大全API接口

食谱菜谱大全API接口 一、食谱菜谱大全API接口二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、食谱菜谱大全API接口 包含所有家用或者商用的食谱菜谱的API接口 二、使用步骤 1…

20 章 多线程

20.1线程简介. 20.2创建线程 2.1继承Thread类 Thread 类是java.lang包中的一个类&#xff0c;从这个类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建立Thread 实例。Thread类中常用的两个构造方法如下: public Thread():创建一个新的线程对象。 public Thre…

【C++初阶(九)】 priority_queue的使用与模拟实现

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

Unity 关于SpriteRenderer 和正交相机缩放

float oldWidth 750f;float oldHeight 1334f;float newWidth Screen.width;float newHeight Screen.height;float oldAspect oldWidth / oldHeight;float newAspect newWidth / newHeight;//水平方向缩放float horizontalCompressionRatio newAspect / oldAspect;//垂直…

Android中的多进程

在Android中也可以像pc一样开启多进程&#xff0c;这在android的编程中通常是比较少见的&#xff0c;以为在一个app基本上都是单进程工作就已经足够了&#xff0c;有一些特殊的场景&#xff0c;我们需要用多进程来做一些额外的工作&#xff0c;比如下载工作等。 在Android的An…

文件批量重命名:多个路径文件批量改名编号并移动到同一路径的操作方法

在日常生活和工作中&#xff0c;可能会遇到需要批量重命名文件的情况。比如说&#xff0c;从不同的路径下载了一堆图片&#xff0c;或者从不同的文件夹中收集了一些文件&#xff0c;现在要将这些文件按照一定的规则进行编号命名。这种情况下&#xff0c;手动修改文件名并且移动…

NX二次开发UF_MTX3_vec_multiply 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_MTX3_vec_multiply Defined in: uf_mtx.h void UF_MTX3_vec_multiply(const double vec [ 3 ] , const double mtx [ 9 ] , double vec_product [ 3 ] ) overview 概述 Returns…

只需十分钟快速入门Python,快速了解基础内容学习。零基础小白入门适用。

文章目录 简介特点搭建开发环境版本hello world注释文件类型变量常量数据类型运算符和表达式控制语句数组相关函数相关字符串相关文件处理对象和类连接mysql关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源…

java设计模式学习之【原型模式】

文章目录 引言原型模式简介定义与用途实现方式UML 使用场景优势与劣势原型模式在spring中的应用员工记录示例代码地址 引言 原型模式是一种创建型设计模式&#xff0c;它允许对象能够复制自身&#xff0c;以此来创建一个新的对象。这种模式在需要重复地创建相似对象时非常有用…