新手入门C语言之移位操作符和位操作符

在C语言中,移位操作符和位操作符是专门针对二进制的数字进行,因此,在描述移位操作符和位操作符之前,我们先来了解十进制,二进制,八进制,十六进制等的含义以及相互之间的转化。

一.进制以及相互的转化

十进制,二进制,八进制,十六进制等只是数值的不同表示形式,十进制就是逢10进1位,二进制就是逢2进1,以此类推。

十进制每个位置上的值的范围是0-9,二进制是0-1,那么他们是如何进行转化的呢?

1.二进制转化为十进制

首先来看,我们是怎么读出十进制的数字的,实际上,例如:123,我们是运用了

这样的计算方法来获得答案的,3对应的是10的0次方,2×10的一次方,以此类推,最后求和即可

那么我们想把二进制数字转换为十进制的数字,实际上也可以运用这样的计算方法,只不过是改成成了✖2的多少次方。

例如,我们求二进制数字1101转换为十进制的数字:

如果我们想将一个八进制数字转换为十进制数字,也是非常简单的:

2.十进制转换为二进制

例如,我们要将十进制数字125转换为二进制数字,我们运用这样的方法:

1.将十进制数字除以2,保留整数部分,将余数写在后面

2.一直进行1过程,直到为0

3.余数按反向书写即可获得二进制数字

3.二进制转化为八(十六)进制

从右向左,三个为一组,无法组成一组就单独进行计算,例如二进制数字1011101转换为八进制数字,我们是这样做的:

转化为十六进制的时候,从右向左,四个为一组即可

需要注意,十六进制每个位置的范围是0~F,包括0~9,A~F,A是10,F是15

确定八进制的数字时候前面加0,例如023,就是八进制的数字,十六进制前面加0x或0X,十六进制的符号大小写与x的相同

5.八(十六)进制转化为二进制

只需要二进制转化的反向进行转化即可

二.原码,反码,补码

三者描绘的都是整数

由于int类型是4个字节,32个bit,每个bit位置可以存放1个二进制数字,但是只有31位可以放大小,最开头的一位放入的数字表示正负

原码:整数的二进制表示,其中我们知道数字分为正数和负数,因此,我们需要额外来表示正负,如果数字为正数的时候,原码的符号位位0,负数则符号位为1

反码,补码:正数的反码和补码与原码一样

负数的反码:负数的原码除了符号位所有位置取反,如果原位置是1,现在改为0

负数的补码:负数的反码+1

转化过程如图:

事实上,原码可以经过取反+1变为补码,补码也可以通过取反+1变为原码

我们在运算的时候,统一使用的都是补码来进行运算

三.移位操作符

移位操作符分为:<<左移操作符    >>右移操作符

书写方法是 a >> (移位的数量),例如:

int b = a >> 2;

1.左移操作符的移动规律:

采用二进制数字全部左移,空位补0的方法,例如,我们写出10的补码以

现在向左移位,空位补0,超出范围的去掉

我们会发现,最后得到的结果是20,因为向左移动,代表着*2

负数也是如此,不过记得,移动的是补码,移动后也是补码

2.右移操作符的移动规律

一般来说,采用数字移动的规律,就是全部右移,然后空位补符号位的数字

四.位操作符

位操作符分为:

1.按位与&:

两个数字的补码的二进制数字在某一个位置上都为1时才为1,只要有0则位0,例如:

int a = 4;	//00000000000000000000000000000100	4补码
int b = -7; //11111111111111111111111111111001 -7补码//00000000000000000000000000000000

我们发现,此时没有相同的,故a&b = 0

2.按位或|:

对应位置有1就是1,都0才是0,例如

int a = 4;	//00000000000000000000000000000100	4补码
int b = -7;	//11111111111111111111111111111001	-7补码//11111111111111111111111111111101   a|b的补码  //10000000000000000000000000000011    还原为原码//-3

一定要记得获得的是补码哦

3.按位异或^:

相同为0,想异为1

int a = 4;	//00000000000000000000000000000100	4补码
int b = -7;	//11111111111111111111111111111001	-7补码//11111111111111111111111111111101//-3

4.按位取反~:

所有位置变为与原本不同的数

五.例题

1.不创建(临时)第三个变量,实现整数交换

我们在实现整数交换时,运用的是这种方法:

int main() {int a = 3;int b = 5;int c = 0;c = a;a = b;b = c;printf("%d %d", a, b);return 0;
}

假设有两个瓶子,分别装了醋和酱油,现在让两个瓶子里面的东西反过来,我们额外拿来了一个瓶子,然后进行了操作。

但在这个题目中,他让我们不创建临时变量,也就是不能额外拿来一个瓶子,实现整数的交换

我们可以采用这种方法:

int main() {int a = 3;int b = 5;//当a与b特别大的时候,超过最大值出现位数丢失(溢出)a = a + b;	//a = 8	b = 5b = a - b;	//b = 3 a = 8a = a - b;	//a = 5 a = 3printf("%d %d", a, b);return 0;
}

这样就可以交换a与b的值了,但是如果a与b两个整数非常大的时候,我们想加可能超过最大的范围,因此,这个方法有一定的局限性

我们在之前学习了^,它有如下的式子 a ^

a = 0,因为两者完全相同,同时 a ^ 0 = a,我们可以写出如下的代码:

int main() {int a = 3;int b = 5;a = a ^ b;b = a ^ b;		// a ^ b ^ b = aa = a ^ b;		// a ^ b ^ a = bprintf("%d %d", a, b);return 0;
}

在这里,我们将a ^ b 视为了一个整体,进行的运算

2.计算一个数字的二进制数的1的数量

如果一个数字%2等于1,此时它的二进制数字的最后一位为1,我们可以写出如下的函数:

int count(unsigned int m) {int num = 0;if (m % 2) num++;m /= 2;return num;
}

其中m要是unsigned int类型,因为m传进去是一串二进制数,如果是负数还需要单独判断,此时,我们将他们统一视为了正数进行的判断

当然,我们也可以通过移位操作符,来判断每一位上是否为1,写出如下的函数:

int count1(unsigned int m) {int count = 0;int i = 0;for (i = 0; i < 32; i++) {if (((m >> i) & 1) == 1)count++;}return count;
}

使得m不断向右移动,来计算

同时,n = n ^ (n-1)的方法可以更快的进行运算,函数如下:

// n = n & (n-1)	让n的二进制中最右边的1消失
// n = 0时,执行几次就是有几个1		有几个1统计几次
int count2(unsigned int m) {int count = 0;while (m) {count++;m = m & (m - 1);}return count;
}

感谢您的观看!

如果您想要进行进一步的训练请移步

C语言进制习题-CSDN博客

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

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

相关文章

《隐私计算简易速速上手小册》第7章:隐私计算与云计算/边缘计算(2024 最新版)

文章目录 7.1 云计算中的隐私保护7.1.1 基础知识7.1.2 主要案例:使用 Python 实现云数据的安全上传和访问7.1.3 拓展案例 1:实现基于角色的访问控制7.1.4 拓展案例 2:使用 Python 保护 API 安全7.2 边缘计算的隐私问题7.2.1 基础知识7.2.2 主要案例:使用 Python 实现边缘设…

Flink join详解(含两类API及coGroup、connect详解)

Flink SQL支持对动态表进行复杂而灵活的连接操作。 为了处理不同的场景&#xff0c;需要多种查询语义&#xff0c;因此有几种不同类型的 Join。 默认情况下&#xff0c;joins 的顺序是没有优化的。表的 join 顺序是在 FROM 从句指定的。可以通过把更新频率最低的表放在第一个、…

使用yolo-seg模型实现自定义自动动态抠图

yolov8导航 如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接&#xff0c;我这边整理了许多其他任务的说明博文&#xff0c;后续也会持续更新&#xff0c;包括yolov8模型优化、sam等等的相关内容。 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; …

DFT系列文章之 《BIST技术》

BIST&#xff1a;BIST是在设计时在电路中植入相关功能电路用于提供自我测试功能的技术&#xff0c;以此降低器件测试对自动测试设备&#xff08;ATE&#xff09;的依赖程度。 ATE&#xff1a;ATE是Automatic Test Equipment的缩写&#xff0c;根据客户的测试要求、图纸及参考方…

Element table 实现表格行、列拖拽功能

安装包 npm install sortablejs --save <template><div class"draggable" style"padding: 20px"><el-table row-key"id" :data"tableData" style"width: 100%" border><el-table-columnv-for"(it…

VS中使用xcopy生成后命令报9009错误

错误现象: download下来的代码&#xff0c;在另一台电脑能使用生成后命令xcopy&#xff0c;换一台电脑后该命令不能使用&#xff0c;报如下错误&#xff1a; 2.错误原因&#xff1a; 这是因为xcopy /Y 为Windows程序命令&#xff0c;xcopy其实是Windows下的一个xcopy.exe,如果…

nginx 模块 常见内置变量 location

一、nginx 模块 ngx_http_core_module 核心模块 ngx_http_access_module 访问控制模块 deny allow ngx_http_auth_basic_module 身份验证 小红小名&#xff08;虚拟用户&#xff09; ftp也有虚拟用户 ngx_http_gzip_module 压缩模块 ngx_http_gzip_static_modul…

Java 学习和实践笔记(19):this的使用方法

this用来指向当前对象的地址。 this的用法&#xff1a; 1&#xff09;在普通方法中&#xff0c;this总是指向调用该方法的对象。在普通方法中&#xff0c;它是作为一种隐式参数一直就存在着&#xff08;这句话的意思&#xff0c;就是其实在普通方法中&#xff0c;编译器一直就…

【前端素材】推荐优质后台管理系统Be admin平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

从零开始学逆向:理解ret2syscall

1.题目信息 链接&#xff1a;https://pan.baidu.com/s/19ymHlZZmVGsJHFmmlwww0w 提取码&#xff1a;r4el 首先checksec 看一下保护机制 2.原理 ret2syscall 即控制程序执行系统调用来获取 shell 什么是系统调用&#xff1f; 操作系统提供给用户的编程接口是提供访问操作系统…

电路设计(28)——交通灯控制器的multisim仿真

1.功能设定 南北、东西两道的红灯时间、绿灯时间均为24S&#xff0c;数码管显示倒计时。在绿灯的最后5S内&#xff0c;黄灯闪烁。有夜间模式&#xff1a;按下按键进入夜间模式。在夜间模式下&#xff0c;数码管显示计数最大值&#xff0c;两个方向的黄灯不停闪烁。 2.电路设计 …

【k8s资源调度-StatefulSet】

1、部署对象StatefulSet资源&#xff08;无状态应用&#xff09; StatefulSet针对的是有状态应用&#xff0c;有状态应用会对我们的当前pod的网络、文件系统等有关联。 2、配置文件如下 StatefulSet资源的配置文件粗略如下&#xff0c;如下的配置信息包含了数据卷&#xff0c;…

uniapp_微信小程序自定义顶部导航栏和右侧胶囊对齐(不对齐来打我)

一、想要的效果 思路首先开启自定义导航栏&#xff0c;取消自带的导航栏&#xff0c;然后计算胶囊的高度和标题对齐 二、成品代码 1、首先再你需要居中的代码添加以下style <view class"header":style"{paddingTop:navBarTop px,height:navBarHeight px,…

GitLab代码库提交量统计工具

1.说明 统计公司所有项目的提交情况&#xff0c;可指定分支和时间段&#xff0c;返回每个人的提交新增数、删除数和总数。 2.API 文档地址&#xff1a;http://公司gitlab域名/help/api/README.md 项目列表查询 返回示例&#xff1a; [{"id": 1, //项目ID"http…

机器学习——线性回归算法、代价函数、梯度下降算法基础

线性回归 还是以之前的预测房价为例&#xff0c;根据不同尺寸的房子对应不同的售价组成的数据集画图&#xff0c;图如下 监督学习算法工作流程 假设函数其实就是我们所说的函数&#xff0c;在房价这个例子中&#xff0c;我们可以从上图中看出房价和房子面积是一个一元的线性函…

【进程地址空间】

目录 上层用户看到的地址父进程创建子进程对代码区的同一变量修改 进程地址空间进程地址空间需要划分 页表 上层用户看到的地址 一个系统中的进程是与其他进程共享内存和CPU的。如果某个进程不小心写入另一个使用该内存的进程&#xff0c;进程就可能以某种完全和程序逻辑无关的…

Apache Commons开源的工具库介绍

Apache Commons 是 Apache 软件基金会主持的一个项目&#xff0c;旨在提供一系列可重用的 Java 组件。这些组件覆盖了从数据封装、文本处理到网络通信等各个方面&#xff0c;是 Java 开发中常用的一系列工具库。Apache Commons 项目下的各个库通常以 "commons-" 开头…

css3实现动画无限循环

要在CSS3中实现动画的无限循环&#xff0c;你可以使用animation 属性和 infinite 关键字。以下是一个示例&#xff1a; keyframes myAnimation {0% { /* 起始状态 */ }50% { /* 中间状态 */ }100% { /* 结束状态 */ }}.element {animation: myAnimation 2s infinite; /* 设置动…

团簇束流沉积技术:氢气传感器守护安全与环境的利器

在当今日益增长的能源需求背景下&#xff0c;氢气作为一种清洁、高效的能源载体&#xff0c;正逐渐受到广泛关注。然而&#xff0c;氢气的易燃易爆特性也带来了不小的安全隐患。因此&#xff0c;精确、快速地监测氢气泄漏成为了确保生产安全和环境监测的重中之重。基于团簇束流…

《凤凰架构》 -分布式事务章节 读书笔记

分布式事务严谨的定义&#xff1a;分布式环境下的事务处理机制 CAP定理&#xff1a;在一个分布式系统中&#xff0c;涉及共享数据问题时&#xff0c;以下三个特性最多只能同时满足两个 一致性&#xff1a;代表数据在任何时刻、任何分布式节点中看到的都是符合预期的&#xff0…