C语言之位操作符:<<、>>、、|、^、~,以及原码反码补码和例题详解


目录

前言

一、原码、反码、补码

二、移位操作符

三、位操作符:&、|、^、~

四、经典例题分析:

总结


前言

        本文将详细介绍C语言中左移操作符<<,右移操作符>>,按位与&,按位或|,按位异或^,按位取反~这六种有关二进制位运算的操作符,为此本文还会介绍整数的原码、反码、补码,后面还有一些经典例题算法,以此来更好的理解这六种操作符,希望对大家有所帮助


一、原码、反码、补码

(注:因涉及二进制以及进制转换,不了解的需先了解二进制和进制转换)

C语言位操作符的操作数都为整数,准确的说是整数的二进制数,而补码才是一个整数真正存储在内存中的形式,以下的操作符也都是作用在补码上

整数有正负之分:

  • 正整数的原、反、补码都相同。
  • 负整数的三种表示方法各不相同。

原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1就得到补码。

我们看下图:

(注:整形占4个字节,一个字节占8个比特位,所用一个整形占32个比特位)

负整数转换规则记忆技巧:

  • 原码到补码:取反,+1。                                      
  • 补码到原码:也是取反,+1。也可以先-1到反码,再取反到原码,结果是一致的

对于整形来说:数据存放内存中其实存放的是补码。

为什么呢?

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路

我们可以验证一下,其实用原码计算是得不到准确结果的,补码计算才能得到准确的结果


二、移位操作符

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

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

1.左移操作符 <<

移位规则:左边抛弃、右边补0 (注:是将整数的补码左移)

语法:整数<<移动位数

我们用上面的14和-9举例:

然后我们画图分析:

通过计算分析,结果一致

总之,左移就记住:左边抛弃,右边补0(补码)


2.右移操作符 >>

移位规则:首先右移运算分两种:

1. 逻辑右移:左边用0填充,右边丢弃

2. 算术右移:左边用原该值的符号位填充,右边丢弃

语法:整数>>移动位数

那么,右移操作符有两种规则怎么用,其实,绝大多数编译器使用的是算术右移,所以我们一般也是使用算术右移

还是用14和-9举例

画图分析:

通过计算分析:结果一致,使用的是算术右移

算术右移:左边用原该值的符号位填充,右边丢弃(补码)


三、位操作符:&、|、^、~

它们的操作数必须为整数,并且是作用于补码

1.按位与 &

规则:当两个相应的二进制位都是1时,结果位才是1,否则,结果位为0

简述:都为1则为1,否则为0

语法:整数&整数

我们看代码:

继续画图分析:

计算分析与结果一致

所以,&:只有相同位置都为1,才是1,否则就是0


2.按位或 |

规则:如果两个相应的二进制位中至少有一个为1,结果位为1,如果都是0,结果位为0

简述:有1则为1,否则为0

语法:整数 | 整数

我们看代码:

继续画图分析:

计算分析与结果一致

所以,|:相应位有1就是1,否则就是0


3.按位异或 ^

规则:如果两个相应的二进制位不同,则结果位为1,如果相同,则结果位为0

简述:相异为1,相同为0

语法:整数^整数

我们看代码:

继续画图分析:

计算分析与结果一致

所以,^:对应位相异为1,相同为0


4.按位取反 ~

规则:与字面意思一致,把二进制位的每一位1变为0,0变为1

语法:~整数

这个比较简单,并且是单目操作符

但是需要注意的是:符号位也会被取反

看代码:

分析:

计算分析与结果一致

需注意的是符号位也会改变


四、经典例题分析:

1.不创建变量,交换两个整数值

我们平时交换两个整数一般采用创建一个变量,当做中间量来交换两个整数,现在不允许创建一个变量,我们因该怎么做呢?

首先我们需要了解按位异或^的一些计算规律:

假如整形a和b,那么它们满足以下规律:

  • a^a=0
  • 0^a=a
  • a^b^a=b(交换律,即先计算a^a=0,再计算0^b=b)

我们简单验证一 a^a=0:很明显,两个相同的数二进制位肯定相同,按位异或就为0

验证 0^a=a:

验证 a^b^a=b;

规律都验证成功

因此这个代码我们可以这样写:使用交换律


2.计算整数二进制中有多少个1

关于这个问题有多种解法,这里主要介绍"Brian Kernighan算法"n&(n-1)

定义一个整数变量n,通过不断将输入数字n与n-1进行按位与&运算,每次运算都会消除n最右边的一个1,直到n变为0。

直接上代码:

画图分析:

每次运算都减去了最右边的一个1,直至减为0,计算非常高效,这是一个非常巧妙的算法,非常值得我们学习


3.改变13的二进制位第5位,并再改回来

分析:

  1. 首先13的二进制为:00000000000000000000000000001101
  2. 我们需要把从右至左的第五位改为1,因此我们可以采用按位或
  3. 而如何得到这个第5位为1其余数为0的这个二进制数呢?其实我们只需要把1<<4就行了,这样就得到了00000000000000000000000000010000
  4. 现在如何改回去呢?就像知道规律破译密码一样
  5. 需要还原的话,我们就需要改变第五位的1为0,我们可以使用按位与&
  6. 按位与11111111111111111111111111101111,那么这个二进制数如何得到呢?其实只需要000000000000000000010000这个数按位取反~就行
  7. 这样这题就结束了


总结

        以上就是本文关于位运算符的全部内容了,希望对大家有所帮助,有问题可以评论区提出,谢谢大家的支持

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

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

相关文章

【Spring AI】09. ETL 管道

文章目录 ETL PipelineAPI 概述入门指南ETL 接口和实现DocumentReaderJsonReaderTextReaderPagePdfDocumentReaderParagraphPdfDocumentReaderTikaDocumentReader DocumentTransformerTextSplitterTokenTextSplitterContentFormatTransformerKeywordMetadataEnricherSummaryMet…

【通信中间件】Fdbus HelloWorld实例

Fdbus实例教程 Fdbus简介 Fdbus 全称 Fast Distributed Bus&#xff08;高速分布式总线&#xff09;&#xff0c;提供IPCRPC功能。适用于多种OS&#xff1a; LinuxQNXAnroidOSWindow Fdbus本质是Socket&#xff0c;IPC基于Unix domain socket&#xff0c;RPC基于TCP。使用G…

MathType打开的窗口太多 MathType说打开窗口太多无法复制怎么解决

在数学文档编辑中&#xff0c;MathType作为一款常用的数学公式编辑工具&#xff0c;使用过程中&#xff0c;我们常常会遇到一些问题&#xff0c;比如MathType打开的窗口过多导致软件运行缓慢甚至崩溃&#xff0c;以及在复制过程中出现“打开窗口太多&#xff0c;无法复制”的提…

241 基于matlab的Dijkstra算法进行路径规划

基于matlab的Dijkstra算法进行路径规划。可根据实际情况输入障碍物和起止点坐标信息&#xff1b; 输出避碰最短路径&#xff1b; 能够利用切线图算法对障碍物区域进行环境建模&#xff0c;设置障碍物的位置和区域。利用Dijkstra算法进行路径规划。程序已调通&#xff0c;可直接…

细说SVPWM原理及软件实现原理,关联PWM实现

细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现 文章目录 细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现1. 前言2. 基础控制原理回顾2.1 FOC 原理回顾2.2 细说 SVPWM2.2.1 矢量扇区计算2.2.2 矢量作用时间计算 2.2.3 如何理解 U4 U6 2/3Udc?2.2.4 如何理解 U4m…

文件传送协议

壹、文件传输协议FTP 一、FTP简介 文件传送协议FTP曾是互联网上使用最广泛的协议&#xff1b; 在互联网发展的早期阶段&#xff0c;用FTP传送文件约占整个互联网的通信量的三分之一&#xff1b;知道1995年&#xff0c;www的通信量才首次超过FTP。 FTP实现的是通过网络实现异…

GaussDB数据库事务管理

一、引言 事务管理是数据库系统中至关重要的一部分&#xff0c;它确保了数据库的一致性和可靠性。在GaussDB数据库中&#xff0c;事务管理不仅遵循传统的ACID特性&#xff0c;还提供了一些高级功能。本文将深入探讨GaussDB数据库事务管理的各个方面。 二、事务的基本概念 2.1…

机器学习:深入解析SVM的核心概念【四、软间隔与正则化】

软间隔与正则化 问题一&#xff1a;优化目标函数是如何得到的&#xff1f;得到的过程是怎样的&#xff1f;问题二&#xff1a;拉格朗日乘子法计算详细过程问题三&#xff1a;KKT条件求解过程问题四&#xff1a;结构风险最小化&#xff08;SRM&#xff09;的原理 在前面的讨论中…

Rust Turbofish 的由来

0x01 什么是 Turbofish 我们运行如下 Rust Snippet&#xff1a; fn main() {let numbers: Vec<i32> vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];let even_numbers numbers.into_iter().filter(|n| n % 2 0).collect();println!("{:?}", even_numbers); }不出意…

Android 设置头像 - 相册拍照

Android开发在个人信息管理中&#xff0c;如果设置头像&#xff0c;一般都提供了从相册选择和拍照两种方式。下午将针对设置用户头像相册和拍照两种方式的具体实现进行详细说明。 在实际实现过程中需要使用到权限管理&#xff0c;新版本的Android需要动态申请权限&#xff0c;权…

React Context

Context https://juejin.cn/post/7244838033454727227?searchId202404012120436CD549D66BBD6C542177 context 提供了一个无需为每层组件手动添加 props, 就能在组件树间进行数据传递的方法 React 中数据通过 props 属性自上而下(由父及子)进行传递&#xff0c;但此种用法对…

Matlab|二阶锥松弛在配电网最优潮流计算中的应用

目录 一、主要内容 二、部分代码 三、程序代码 四、下载链接 一、主要内容 最优潮流计算是电网规划、优化运行的重要基础。首先建立了配电网全天有功损耗最小化的最优潮流计算模型&#xff1b;其次结合辐射型配电网潮流特点建立支路潮流约束&#xff0c;并考虑配电网中的可…

macOS sonoma 14.4.1编译JDK 12

macOS sonoma 14.4.1编译JDK 12 环境参考文档开始简述问题心路历程着手解决最终解决(前面有点啰嗦了&#xff0c;可以直接看这里) 记录一次靠自己看代码解决问题的经历(总之就是非常开心)。 首先&#xff0c;先diss一下bing&#xff0c;我差一点就放弃了。 环境 macOS sonom…

[力扣]——125.验证回文串

class Solution {public static boolean isValidChar(char ch){if((ch > a && ch < z) ||(ch > 0 && ch < 9)){return true;}return false;}public boolean isPalindrome(String s) {// 将大小写统一起来s s.toLowerCase();int left 0, right s…

vulnhub靶场之FunBox-2

一.环境搭建 1.靶场描述 Boot2Root ! This can be a real life scenario if rockies becomes admins. Easy going in round about 15 mins. Bit more, if you are find and stuck in the rabbit-hole first. This VM is created/tested with Virtualbox. Maybe it works with…

百面算法工程师 | 支持向量机——SVM

文章目录 15.1 SVM15.2 SVM原理15.3 SVM解决问题的类型15.4 核函数的作用以及特点15.5 核函数的表达式15.6 SVM为什么引入对偶问题15.7 SVM使用SGD及步骤15.8 为什么SVM对缺失数据敏感15.9 SVM怎么防止过拟合 欢迎大家订阅我的专栏一起学习共同进步 祝大家早日拿到offer&#x…

利用亚马逊云科技GenAI企业助手Amazon Q Business构建企业代码开发知识库

2024年五一节假日的前一天&#xff0c;亚马逊云科技正式重磅发布了云计算行业期待已久的服务——Amazon Q Business。Amazon Q Business是专为企业用户打造的一个开箱即用的完善而强大企业GenAI助手。企业用户只需要将Amazon Q Business连接到现有的企业内部数据源&#xff0c;…

小程序地理位置接口权限直接抄作业

小程序地理位置接口有什么功能&#xff1f; 随着小程序生态的发展&#xff0c;越来越多的小程序开发者会通过官方提供的自带接口来给用户提供便捷的服务。但是当涉及到地理位置接口时&#xff0c;却经常遇到申请驳回的问题&#xff0c;反复修改也无法通过&#xff0c;给的理由也…

【自研网关系列】过滤器链 -- 限流过滤器

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…

ESP32-C3模组上跑通MQTT(1)

本文内容参考&#xff1a; 《ESP32-C3 物联网工程开发实战》 特此致谢&#xff01; 一、远程控制的介绍 什么是远程控制&#xff1f;顾名思义&#xff0c;远程控制就是远距离控制&#xff0c;是指控制设备&#xff08;如智能手机、计算机等网络设备&#xff09;通过广域网控制…