20.《C语言》——【移位操作符】

🌹开场语

亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能,成为一名优秀的程序员。如果你有任何疑问或建议,请随时在评论区留言,让我们一起成长进步!现在,让我们开始这场知识之旅吧!


🚀个人主页: FEN03

📖文章专栏: C语言


文章目录

  • 🌹开场语
  • [▶️ 前言](#▶️ 前言)
  • [🚀 1. 移位操作符](#🚀 1. 移位操作符)
    • [🚀 1.1 左移操作符](#🚀 1.1 左移操作符)
    • [🚀 1.2 右移操作符](#🚀 1.2 右移操作符)
  • 🌹总结
  • 🌹结束语

▶️ 前言


本章节,就让我们来学习移位操作符,如有错误❌,还请大佬们指出!🌹


🚀 1. 移位操作符


移位操作符分为2种分别为:

  1. 左移操作符
  2. 右移操作符

提示:移位操作符只能对于整数


🚀 1.1 左移操作符


移位的规则:左边丢弃,右边补0

如:我们把5左移1位

代码如下:

c 复制代码
//左移操作符
#include<stdio.h>
int main()
{
	int n = 5; 
	int m = n << 1; 
	printf("n = %d\n", n); 
	printf("m = %d\n", m); 
	return 0;
}

运行结果:

n 经过左移1位,最终得到的结果是10

如何进行左移的?

  1. 我们知道数值5在内存中是以二进制的形式进行存储的,如下图:
  2. 我们知道二进制表示形式有3种,分别为原码,反码,补码。正数的原反补码相同,而负数的原反补不相同,需要进行转换。
  3. 那么我们对其进行左移1位,其实是对数值5的补码进行操作的 ,如下图:

上边的例子,我们举的是正数,负数又如何进行左移呢?

代码如下:

c 复制代码
#include<stdio.h>
int main()
{
	int a = -3;  
	int b = a << 2;  

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

运行结果:

负数是如何进行左移呢?

  1. 例子中举得是-3,左移2位,我们需要把-3的原码写出来,左移操作的是补码,原码需要取反得到反码,反码+1得到补码。如下图:
  2. 操作的是补码,补码进行左移2位,得到的就是左移后的补码,但是我们看到的是原码,所以还需要对补码进行转换得到原码,才是我们在屏幕上看到的值。

小节:

  1. 我们已经举例了2个,分别是5和-3,得到的结果分别是10和-12,可以说左移操作符是有乘2的效果 ,但是并不是所有的数都有着乘2的效果,对于个别数来说是没有的。

🚀 1.2 右移操作符


右移操作符相对于左移操作符,会分为2种,至于是哪一种取决于编译器的实现,但是大多数是采用算术右移 ,它们的运算规则:

  1. 逻辑右移:右边丢弃,左边补0
  2. 算术右移:右边丢弃,左边按原符号位值补

例子1:

c 复制代码
#include<stdio.h>
int main()
{
	int a = 4;   
	int b = a >> 1;  
	printf("a = %d\n", a); 
	printf("b = %d\n", b);

	return 0; 
}

运行结果:

如何进行右移?

  1. 写出该值的原反补码,如下:
  2. 正数的原反补码相同,我们不需要对其进行任何的转换

例子1举的是正数,负数又如何进行右移操作呢?

例子2:

c 复制代码
#include<stdio.h>
int main() 
{
	int n = -8;  
	int m = n >> 2;  
	printf("n = %d\n", n);     
	printf("m = %d\n", m);  
	return 0;
}

运行结果:

负数如何进行的呢?

  1. 写出该数的原反补码,因为是负数,所以原反补码不相同,需要进行转换,如下:

  2. 补码进行操作,右移2位丢弃,左边按原符号位值来补,最后还需要进行原反补码的转换


小节:

  1. 我们已经举例了2个,分别是4和-8,得到的结果分别是2和-2,可以说右移操作符是有除2的效果,但是并不是所有的数都有着除2的效果,对于个别数来说是没有的。

🌹总结


  1. 对于移位操作符,我们只需要记住规则就可以,当然了想要更好的了解,还需要对二进制的三种表示形式:原码,反码,补码,有所了解。
  2. 这是因为,移位操作符操作的是二进制的补码。所以当我们得到原码还需要进行转换得到补码。

🌹结束语


非常感谢您花时间阅读我的博客,希望我的分享能为您带来收获。如果您对本文有任何想法或疑问,欢迎在评论区留言交流。如果您喜欢我的博客,请继续关注,我会定期更新更多精彩内容。最后,别忘了行动起来的力量,让我们一起实践这些方法,见证自己的成长和进步!

再见,祝您生活愉快!


相关推荐
Dovis(誓平步青云)15 小时前
拖动关键帧角色就抽动,动画编辑器怎样补齐中间状态
开发语言·前端·javascript·机器学习·编辑器
行走的陀螺仪15 小时前
Claude Code 从入门到实战(二):Bash工具、Plan模式与后台任务
开发语言·bash
努力努力再努力wz15 小时前
【Lua 入门系列】从执行模型到事件驱动:一文理解 Lua 有栈协程、挂起恢复与协作式调度
开发语言·lua
椒颜皮皮虾྅15 小时前
一套 C# 接口,解锁四类视觉任务:DeploySharp 分类、分割、关键点与旋转框实战
开发语言·分类·c#
2603_9658966216 小时前
JavaScript 原型与原型链
开发语言·前端·javascript
朋友圈自动点赞工具16 小时前
Ruby方法查找:对象不存方法
开发语言·前端·ruby·科技资讯
D e re k ZH16 小时前
C++ 模板与泛型编程进阶(No 2)
开发语言·c++
一级新生16 小时前
LLM _ Agent _ Skill _ 专家 的关系与选型笔记
java·开发语言·人工智能·笔记·大模型·智能体·skill
starzy199016 小时前
Scala String操作:从插值器到正则的完整指南
开发语言·后端·scala
普通人616 小时前
CSS-box-sizing-使用指南
开发语言·前端·css·1024程序员节