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

news2024/10/7 4:34:57


目录

前言

一、原码、反码、补码

二、移位操作符

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

四、经典例题分析:

总结


前言

        本文将详细介绍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.coloradmin.cn/o/1640035.html

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

相关文章

VS(Visual Studio)中查找项目里的中文字符

目录 正则表达式查找中文字符 正则表达式查找中文字符 在Visual Studio (VS) 中查找所有的中文字符&#xff0c;你可以使用其强大的查找和替换功能。不过&#xff0c;由于中文字符的范围非常广泛&#xff08;包括简体中文、繁体中文、日本汉字、韩国汉字等&#xff09;&#xf…

C语言——小知识和小细节17

一、未能给指针成功赋值 #include <stdio.h> #include <stdlib.h> #include <string.h>void GetMemory(char* p) {p (char*)malloc(20 * sizeof(char)); }void Test() {char* str NULL;GetMemory(str);strcpy(str, "Hello World!");printf(&quo…

计算机网络chapter2——应用层

文章目录 第2章 应用层章节引出—— 2.1应用层协议原理2.1.1 网络应用程序体系结构&#xff08;1&#xff09;客户-服务器体系结构&#xff08;2&#xff09;对等(P2P)体系结构2.1.2 进程通信1.客户和服务器进程2.进程与计算机网络之间的接口3. 进程寻址 2.1.3 可供应用程序使用…

Linux shell编程学习笔记48:touch命令

0 前言 touch是csdn技能树Linux基础练习题中最常见的一条命令&#xff0c;这次我们就来研究它的功能和用法。 1. touch命令的功能、格式和选项说明 我们可以使用命令 touch --help 来查看touch命令的帮助信息。 purpleEndurer bash ~ $ touch --help Usage: touch [OPTION]…

双指针(C++)

文章目录 1、移动零2、复写零3、快乐数4、盛最多水的容器5、有效三角形的个数6、和为s的两个数7、三数之和8、四数之和 需要理解的是&#xff0c;双指针并非只有指针&#xff0c;双指针的意思是两个位置。比如对于数组来说&#xff0c;两个下标也是双指针。当然&#xff0c;也可…

基础IO认识

回顾文件 我们之前认识文件只是在语言程度上理解&#xff0c;但是我们理解的不够彻底&#xff0c;要想真正理解文件要在os上理解。 简单代码认识 1 #include<stdio.h>2 int main(){3 FILE* fpfopen("log.txt","w");4 if(fpNULL){5 p…

【小浩算法 BST与其验证】

BST与其验证 前言我的思路思路一 中序遍历判断数组无重复递增思路二 递归边界最大值最小值的传递 我的代码测试用例1测试用例2 前言 BST是二叉树一个经典应用&#xff0c;我们常常将其用于数据的查找以及构建平衡二叉树等。今天我所做的题目是验证一颗二叉树是否为二叉搜索树&…

Web,Sip,Rtsp,Rtmp,WebRtc,专业MCU融屏视频混流会议直播方案分析

随着万物互联&#xff0c;视频会议直播互动深入业务各方面&#xff0c;主流SFU并不适合管理&#xff0c;很多业务需要各种监控终端&#xff0c;互动SIP硬件设备&#xff0c;Web在线业务平台能相互融合&#xff0c;互联互通&#xff0c; 视频混流直播&#xff0c;录存直播推广&a…

带环链表问题

带环链表就是字面意思带环的链表&#xff0c;例如以下这三种情况 练习题 1.给定一个链表&#xff0c;判断链表中是否带环. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;快慢指针&#xff0c;慢指针走一步&#xff0c;快指针走两步&#xff0c;两个指针从链表的起…

硅片和SOI哪个研究方向更好?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;我研一将要结束&#xff0c;即将进入课题组。我们课题组方向有硅片和soi两种方向&#xff0c;这两种方向该如何选择呢&#xff1f; 硅片与…

python离线安装包的方法

python离线安装包的方法 访问对应安装包的镜像文件的网站找到适合自己的whl文件安装 访问对应安装包的镜像文件的网站 https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/<包名>/找到适合自己的whl文件 安装 下载完成后&#xff0c;进入opencv_python-3.4.11.45-c…

这是一个简单网站,后续还会更新

1、首页效果图 代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>爱德照明网站首页</title> <style> /*外部样式*/ charset "utf-8"…

标准降水指数(SPI)、标准化降水蒸发蒸腾指数(SPEI)和帕尔默干旱指数(PDSI)的下载、读取和可视化

数据下载网址&#xff1a;WWDT Data (dri.edu)https://wrcc.dri.edu/wwdt/data/PRISM/ 以SPI为例说明&#xff0c; 标准化降水指数(Standardized Precipitation Index, SPI)是由Mckee et al(.1993)分析美国科罗拉多干旱时,发现降水服从偏态分布,基于此提出了标准化降水指数。…

【千帆平台】使用AppBuilder三步手搓应用创建精准多轮对话agent之K12互动式练习题

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用头像应用名称应用描述角色指令能力扩展开场白 …

gitlab设置保护分支

gitlab设置保护分支方法 进入代码仓库首页&#xff0c;找到settings下的repository并点击进入 找到Protected Branches 下的Exoand按钮&#xff0c;并点击展开 可以看到已经存在默认的保护分支&#xff0c;通常是master/main分支&#xff0c;也可以添加新的保护分支 新建保护分…

使用idm下载百度云被限速 idm下载大文件后要整合 idm下载百度网盘有限制最新解决办法教程 idm限速解除方法

Internet Download Manager简称IDM,是一款Windows系统专业下载加速工具,IDM下载器支持多种类型文件下载,并能完美恢复各种中断的下载任务,是一款Windows平台下的多线程下载器&#xff0c;支持浏览器自动嗅探功能下载资源文件&#xff0c;包括视频、音频以及图片等类型文件&…

BUUCTF:Web 解析(一)

一、[极客大挑战 2019] EasySQL 点击链接进入靶场 登录页面&#xff0c;查看页面源代码发现没留注释 先输入 admin or 11# 提交看看&#xff08;根据题意猜测考察的 SQL 注入&#xff09; 显示 Flag 二、[极客大挑战 2019] Havefun 打开靶场 页面只有一只猫&#xff0c;打开…

区块链 | IPFS:Merkle DAG(进阶版)

&#x1f98a;原文&#xff1a;Merkle DAGs: Structuring Data for the Distributed Web &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 Merkle DAG 当我们在计算机上表示图时&#xff0c;必须通过提供节点和边的具体表示来编码我们的数据…

jenkins 部署springboot 项目

文章目录 持续集成指定tag发布 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 持续集成 为了让程序代码可以自动推送到测试环境基于Docker服务运行…

服务网关GateWay原理

文章目录 自动装配核心类GatewayAutoConfigurationDispatcherHandler请求处理阶段apply方法httpHandler#handle方法WebHandler#handle方法DispatchHanlder#handle方法第一步 getHandler获取请求映射第二步 invokeHandler 请求适配第三步 handleResult请求处理总结 上一篇博文我…