移位操作符详解

一篇文章带你学会移位和位操作符解析【画图详解】 文章目录前言一、移位操作符左移 <<右移 >>总结要点二、位操作符按位与 &按位或 |按位异或 ^总结要点变态面试题总结 前言 相较于其他操作符而言,移位操作符和位操作符不太常见,它们的运算方式比较复杂,而我也时常忘记它们的计算方法,现写一篇相关笔记,方便查看,也供各位读者查阅。 一、移位操作符 左移 << 左移运算符<< 首先让我们来了解一下一些相关的基本定义。 移位操作符,移动的是二进制位,是存储在计算机中的二进制,相对于整数而言,存放在内存 阅读详情

必要理解

在了解移位操作符之前先了解一下一个整数的原码 反码 补码

那原码 反码 补码怎么写呢?接下来我们给出定义

按照一个数的正负 直接写出他的二进制形式就得到了他的原码
正数的原码 反码 补码 都是相同的
负数的原码 反码 补码 都是需要计算的
负数的反码就是符号位(第一位1代表负数0代表正数)不变 其他的按位取反 就是反码
补码是反码+1
一个整型占四个字节也就是三十二的比特位

图示理解↓

b490abd1d0a54e829bed4834a29890cf.png

#include<stdio.h>
int main()
{
	int a = 10;
	//00000000000000000000000000001010 原码 32位
	//00000000000000000000000000001010 反码
	//00000000000000000000000000001010 补码
	int b = -10;
	//10000000000000000000000000001010 原码
	//11111111111111111111111111110101 反码
	//11111111111111111111111111110110 补码

	return 0;
}

在了解完原码 反码 补码之后 我们就正式讲解移位符↓

1 什么是移位符呢?

移位符就是对一个整数的二进制形式进行左右移位

左移操作符就是 左边丢弃右边补0

右移操作符包括算数右移操作符和逻辑右移操作符(不常见取决于编译器)

算数右移就是右边丢弃 左边补充原来的符号位

逻辑右移就是右边丢弃 左边直接补充0

2 左移位讲解↓

#include<stdio.h>
int main()
{
	int a = 10;
	//00000000000000000000000000001010 原码 32位
	//00000000000000000000000000001010 反码
	//00000000000000000000000000001010 补码
	int b = -10;
	//10000000000000000000000000001010 原码
	//11111111111111111111111111110101 反码
	//11111111111111111111111111110110 补码

	int c = a << 1;
	int d = b << 1;
	printf("a=%d\n", a);
	printf("c=%d\n", c);
	printf("b=%d\n", b);
	printf("d=%d\n", d);
	return 0;
}

看看运行结果↓

6098b5c69b9741b5a8eb3b12bfb26587.png

移位的本质是什么呢?接下来讲解以别-10为例子

其实在电脑内存中存储的都是补码 移位也是补码在移位 但是打印出来确实原码的数值

来看本质↓

b2c0cdb618984efcad0d1bad843a66a0.png

补码写出来了 根据图1的逆向求原码

原码为

100000000000000000000000000010100

十进制结果就是-20


2 右移位(这里只讲解算数右移)

#include<stdio.h>
int main()
{
	int e = -10;
	//10000000000000000000000000001010 原码
	//11111111111111111111111111110101 反码
	//11111111111111111111111111110110 补码
	int f = -10 >> 1;
	printf("e=%d\n", e);
	printf("f=%d\n", f);
	return 0;
}

运行结果↓

c00d25f45a6f480d8af0e267c1b72878.png

来看看本质↓

56cb32cd90dd442798f392605d631a4c.png

 

经过计算结果就是-5

以上就是移位操作符的讲解

补充:>>x 中的x必须是正整数 

而所需移位的数字是整数

下面是全部代码↓

//移位操作符
#include<stdio.h>
int main()
{
	//按照一个数的正负 直接写出他的二进制形式就得到了他的原码
	//正数的原码 反码 补码 都是相同的
	//负数的原码 反码 补码 都是需要计算的
	//负数的反码就是符号位不变 其他的按位取反 就是反码
	//补码是反码+1
	//一个整型占四个字节也就是三十二的比特位
	int a = 10;
	//00000000000000000000000000001010 原码
	//00000000000000000000000000001010 反码
	//00000000000000000000000000001010 补码
	int b = -10;
	//10000000000000000000000000001010 原码
	//11111111111111111111111111110101 反码
	//11111111111111111111111111110110 补码

	//11111111111111111111111111110110 补码
	//10000000000000000000000000001001 ----*不是反码
	//10000000000000000000000000001010 原码

	//左移位
	int c = a << 1;
	int d = b << 1;
	//右移位  
	//逻辑右移(一般不见):右边丢弃 左边直接补0
	//算数右移(常见):右边丢弃 左边补充原来的符号位
	int e = -10;
	//10000000000000000000000000001010 原码
	//11111111111111111111111111110101 反码
	//11111111111111111111111111110110 补码
	int f = -10 >> 1;
	printf("a=%d\n", a);
	printf("c=%d\n", c);
	printf("b=%d\n", b);
	printf("d=%d\n", d);
	printf("e=%d\n", e);
	printf("f=%d\n", f);
	return 0;
}

78a86c11d26743c9a1e064f669323115.png

看完理解了可以去找一些练习去做做


 

 

 

C语言第十四课:操作符详解(上)——算数、移位、位、赋值操作符 我们在前面几篇文章中对井字棋和扫雷两个阶段性练习进行了详细的练习讲解,想必各位小伙伴们对于前面学到的知识也能较为充分的掌握了。从本文开始,我们将继续进行下一部分关于操作符的学习。 阅读详情

相关推荐

【Ubuntu2404】Ubuntu24.04安装NVIDIA驱动/CUDA/cuDNN搭建神经网络训练环境

NVIDIA 驱动、CUDA和cuDNN是紧密相关但各自具有独特功能的技术,它们共同为图形处理单元(GPU)加速的应用程序提供了强大的支持。本文主要介绍如何安装 `NVIDIA` 驱动、CUDA及cuDNN,为后续神经网络训练提供支持。本文主要介绍Ubuntu24.04安装NVIDIA驱动、CUDA和cuDNN的流程。

王阿巴和王咕噜 1万+

移位运算符(详细介绍)

移位运算符

m0_63783532的博客 6813

AI与Agent赋能下的软件测试变革:面向未来测试工程师的工作方法论

AI Agent 软件测试 测试 software testing test

测试技师的自我修养 1234

位操作符详解(移位操作符(左移/右移)、按位与‘&’操作符、按位或‘|’操作符、按位异或‘^’操作符)

c语言位操作符详解(移位操作符(左移/右移)、按位与‘&’操作符、按位或‘|’操作符、按位异或‘^’操作符)

qq_58284486的博客 4645

DMR对讲机的基本概念理解

刚刚入手DMR对讲机,尚未成功联通。国内互联网上能找到的资料很少,大多数也都是一些DMR协议介绍之类的玩意,对实际操作没有指导意义。以下全部是这几天在网上研究各种资料得出的个人思考,如有错误请斧正。 相比与模拟通讯系统,DMR将语音信号转换为包的形式进行收发。将DMR对比成TCP/IP系统会更容易理解。 一般DMR对讲机都支持模数双通,说明DMR应该使用了跟FM同样的无线AP组件,只在解码上有区别。对讲机先使用DMR进行数字解码,解码成功则说明是数字信号,不成功则使用模拟方式再次进行解码。可以对等理解为

1万+

告别虚拟机!在Windows上用WSL+VSCode搞定ArduPilot开发环境(保姆级避坑指南)

本文提供了一份详细的保姆级指南,介绍如何在Windows上使用WSL和VSCode搭建高效的ArduPilot开发环境,告别虚拟机性能损耗。从WSL安装、VSCode配置到ArduPilot固件编译和调试技巧,涵盖开发全流程中的关键步骤和常见问题解决方案,帮助无人机开发者快速构建专业级开发环境。

weixin_42543046的博客 461

C语言-【移位操作符详解】

这篇文章主要介绍了C语言中移位操作符

yyzzzj0301的博客 5495

解决 `version ‘GLIBCXX_3.4.32‘ not found‘ not found` 错误

解决 `version 'GLIBCXX_3.4.32' not found' not found` 错误

engchina的专栏 5675

移位操作符(<<左移操作符 、 >>右移操作符)和位操作符(&按位与、 |按位或、 ^按位异或)和逻辑操作符(&&逻辑与、 ||逻辑或)

移位操作符(<<左移操作符 、 >>右移操作符)和位操作符(&按位与、 |按位或、 ^按位异或)和逻辑操作符(&&逻辑与、 ||逻辑或)

D2460596421的博客 1651

python实现带符号的二进制数转换十进制数 (附完整源码)

python实现带符号的二进制数转换十进制数 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 554

扫码登录原理

扫码登录功能通过PC端与移动端的交互实现安全认证,分为三个阶段:待扫描阶段生成唯一二维码ID并轮询状态;已扫描阶段移动端提交token与二维码ID关联,生成临时token并要求用户确认;确认阶段验证临时token后为PC端生成正式登录凭证。整个过程通过二维码唯一性、状态轮询和二次确认机制确保安全性,防止未授权登录,最终完成跨设备认证流程。

阿杰同学的博客 346

【c 语言 】移位操作符详解

本文将详细解析C语言中移位操作符的工作原理、基本语法、应用场景以及注意事项和常见问题,帮助读者更好地掌握这一强大的工具。

m0_74195174的博客 5162

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

详解C语言中的移位操作符:左移操作符,右移操作符——算术右移,逻辑右移。

m0_70980326的博客 5242

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

移位操作符和位操作符详解

整型数据大小为4个字节(占用一个基本内存单元),一个字节有8个比特位即8个二进制位,所以整数用4*8=32个二进制位表示。的原码、反码、补码都一样,所以当一个有符号整数的最高位是0时,即表示正数。按位与&:将两个数的每一二进制位都进行比对,当都是1才取1,其余都取0。按位或|:将两个数的每一二进制位都进行比对,当都是0才取0,其余都取1。按位异或^:将两个数的每一二进制位都进行比对,相同位0,相异为1。按位取反~:一个数的每一二进制位都取反,0变1,1变0。的二进制形式有三类:原码、反码、补码(

golden_recuna的博客 1086

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C语言之移位操作符、位操作符详解

目录 1、移位操作符 2、位操作符 1、移位操作符 分为左移操作符(>>)和右移操作符(<<)。 左移操作符: 移位规则:左边抛弃,右边补0。 什么意思呢,现在就让我来仔细讲解一番。 比如我们定义一个整型变量a,给它赋初值5.如int a=5;然后将a左移,即a<<2,得到的结果又是多少呢?在讲之前,我们首先要了解到整型5在内存中是怎样存储的,不太清楚的友友们就请看我之前一篇博客整数的3种表达形式及在内存中的存储啦,里面有详细讲解。整型5是以补码的形式

m0_63039919的博客 1万+

C语言移位操作符的使用详解

我们可以得出结论:对任意一个值a对他左移()n位,对应值的变化位:a /2^N

Ultraman_leo77的博客 1163

C语言位运算详解(移位操作符、位操作符)

前言:C语言的位运算是基于整数的运算,因为C语言语法规定了移位操作符、位操作符的操作数只能是整数。

喜羊羊的博客 6234

【C语言】位与移位操作符详解

对于C语言中位操作符与移位操作符的介绍

Renswc的博客 2937

操作符详解(1)算数操作符,移位操作符

不懂操作符和原反补码的相关知识可以点开看哦!

weixin_62529445的博客 776

移位操作符 位操作符详解

移位操作符 位操作符详解

2302_77675796的博客 351

操作符详解(1)——算术,移位操作符

操作符分类 1.算术操作符 2.移位操作符 3.位操作符 4.赋值操作符 5.单目操作符 6.关系操作符 7.逻辑操作符 8.条件操作符 9.逗号表达式 10.下标引用、函数调用和结构成员 1.算术操作符 1)除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 2) 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。 3) % 操作符的两个操作数必须为整数。返回的是整除之后的余数。 2.移位操作符 移位操作符,移动的是二进制.

m0_68071216的博客 1411

C语言之详解位操作符和移位操作符

详细解释二进制、八进制、十六进制与十进制之间的联系,原码、反码、补码,位操作符,移位操作符,以及在实际中的使用案例

ijj_zZ的博客 1359

【C语言操作符详解(一)】--进制转换,原反补码,移位操作符,位操作符,逗号表达式,下标访问及函数调用操作符

目录一.操作符的分类二.二进制和进制转换2.1--2进制转10进制​编辑 2.1.1--10进制转2进制数字2.2--2进制转8进制和16进制 2.2.1--2进制转8进制2.2.2--2进制转16进制 三.原码,反码,补码四.移位操作符4.1--左移操作符4.2--右移操作符五.位操作符:&,|,^,~5.1--位操作符的理解与使用5.2--相关练习5.2.1--练习1:不能创建临时变量(第三个变量),实现两个整数的交换。5.2.2--练习2:编写代码实现:求一个整数存储在内存中的二进制中1的个数5.2.

会当凌绝顶,一览众山小 1625

移位操作符与位操作符详解

之后再将每一个数右移至该位置,按位与1判断是否为0,为1则说明该位置的二进制位是0分一组,将该组数异或在一起,为零说明二进制位是1分为一组,将该组数异或在一起,即可以求得该单身狗数。在这里单生狗数是 5和6 ,我们可以发现5与6异或之后的结果是0 1 1,他的二进制位最后一位是1,那我们就按每个数二进制位最后一位是否是1来分组。移位操作符的操作数只能是整数 ,移动的是的是操作数的二进制数码位置,整数在内存中存放的是补码。首先我们要对数进行分组,假设有数组的元素是:1,2,3,4,5,1,2,3,4,6。

qq_61422622的博客 359
上一篇: 扫雷游戏升级版 含递归链式展开(一次展开一片区域) 代码详细解读 C语言
下一篇: 第十六届蓝桥杯软件校模拟赛C/CPP部分试题代码
刘 大 望
博客等级 码龄2年 896粉丝 61原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值