按位操作符详解

大家好啊,我是情谊,今天我们来讨论一下按位操作符的知识点与应用,按位操作符有时候在解决一些问题的时候可以提供一个很好的解题思路,话不多说,我们直接来看!

今天我们主要是从两个方面来讲述一下按位操作符的一些特点,一个是详细介绍按位操作符的定义以及一些按位操作符的经典例题,希望能对大家有一些好的建议。

按位操作符:1&按位与操作符  2 | 按位或操作符  3 ^按位异或操作符  4 !按位取反操作符

5<<左移操作符   6 >>右移操作符

开始之前,我们先来介绍一下原码,反码,补码的知识点

整数的二进制位表示方法有三种:原码,反码,补码,有符号的整数在这三种表示方法的基础上还增加了符号位表示和数值位表示,在有符号位的整数中,第一位表示符号位,其余的就表示数值位。

在有符号整数里面,正数的符号位是“0”,负数的符号位是“1”

正整数的原码,反码,补码都是一样的,负数的原码,反码,补码是不一样的

原码:直接将该整数按照正负数的形式翻译为二进制得到的就是原码

反码:将原码的符号不变,其余的数值位依次取反得到的就是反码

补码:在反码的基础上+1就得到了补码

对于一个整型数据来说,在内存中存储的方式其实是反码

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

好了,我们介绍了原码,反码,补码后,我们再来看看移位操作符(注意,移位操作符只能对整数进行操作)

1<<左移操作符

将二进制位除符号位全部左移一个单位,右边用零给补上

我们直接用一个代码来解释

我们可以看到,b的结果是12,为什么会得到这个数呢?我们接着往下看,左移操作符是将a的二进制位向左边移动一位,所以我们先将6的二进制位写出来,(注意哈,我们处理二进制代码的时候依然使用的是补码,但是这里正整数的原,反,补码是相同的,如果处理结果是负数,就要将其转换为二进制的补码再进行操作)00000000000000000000000000000110 ,接下来,我们将整个二进制向左边移动一位,右边空出来的用0补上,得到00000000000000000000000000001100,接着,我们将其转化为十进制的数据,就是12

但是在上面的这个代码中,我们还需要注意的是,<<只是一个操作符,执行并不会改变原来的值,也就是说,a的值并没有被改变,只是执行了左移操作符后将得到的结果赋给了b。

我们来看看负数

-6的原码是10000000000000000000000000000110

符号位不变,取反得到反码 11111111111111111111111111111001

+1得到补码11111111111111111111111111111010

我们再进行左移操作,除符号位其余全部左移一格,得到11111111111111111111111111110100

这个得到的还是补码,我们将其转化为原码就是-12

2右移操作符

右移操作符和左移操作符有部分区别,右移分为两种 操作方式:

1逻辑右移:左边用0填充,右边直接舍弃

2算术右移:左边用符号位进行补齐,右边舍弃

但是具体到底是哪一种,我们要看编译器的实现,常见的编译器都是采用算术右移的

由于前面介绍了左移操作符,所以我们右移操作符就暂时不再提及

3位操作符&,|, ^ ,~

&按位与操作符:整数的二进制位进行比较,都为1才是1,不同的都为0

我们接下来看代码

我们来看看这个代码

a是正数,原码,反码,补码相同,所以补码是00000000 00000000 00000000 00000011

b的补码是11111111111111111111111111111011

a&b就是这两个二进制位进行比较,同时是1才是1,其余都是0,得到00000000000000000000000000000011,所以得到的结果是3

|按位或操作符:有1就是1,全是0才是0

我们也直接看代码

按照规则,3和-5之间的二进制位比较,全是0才是0,有1则就是1

所以得到的补码是1111111111111111111111111111011 ,转换为原码则就是-5

^按位异或:将两个数的二进制位进行比较,相同位0,相异为1

我们也直接看代码

按照规则,相同为0,相异为1,我们可以得到补码11111111111111111111111111111000,再换算为原码后得到10000000000000000000000000001000,就得到-8

~按位取反:对于一个数的二进制位全部进行取反(包括符号位)

在上面的代码中,我们可以写出3的补码,000000000000000000000000000000011,全部进行取反后得到11111111 11111111 11111111 11111100,得到的是一个数的补码,换算成原码后就是100000000000000000000000000100,就得到了-4

例题介绍

上面我们介绍了这几个操作符后我们在来看看一些具体的例题

1在不创建第三个变量的情况下交换两个数的值

分析:

上面的思路就很好的指明了方式,我们使用a|b,然后将结果再~a^7就可以了

 2编写代码实现,求一个数据存储在内存中的二进制中1的个数

n = 13

我们每次让一个数按位与&一个1后,就去除了一个1,然后我们在左移一个操作数,接下来我们可以一直按位与1,循环可以求出1的个数

 

我们接下来再看一个方法,一个特别经典的方法:使用n&(n-1)

我们假设n = 15

在上面的这个理解中,我们发现n&(n-1)可以得到去除一个1,接下来再次进行

我们可以看到,每进行一次都可以去除一个1,我们统计去除的1的个数就可以计算出1的个数了

,我们来看代码

好了,今天我们的介绍也是在这里了,希望我的一点小的见解能够给你们一点点的帮助,看到这里的小伙伴不如点点赞呗,你们的赞就是对我的最好的鼓励,对了,如果上面文章中出现一些小错误还请担待啦,我会不断进步的,谢谢大家,我们下周见!! 

 

 

 

 

 

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

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

相关文章

突破编程_C++_C++11新特性(智能指针shared_ptr与weak_ptr)

1 std::shared_ptr 的概述 std::shared_ptr 是 C11 标准库中引入的一种智能指针&#xff0c;用于表示共享所有权的智能指针。它允许多个 shared_ptr 实例共享同一个对象的所有权&#xff0c;并在最后一个引用该对象的 shared_ptr 被销毁或被重置时自动删除该对象。这种特性使得…

Redis:使用redis-dump导出、导入、还原数据实例

redis的备份和还原&#xff0c;借助了第三方的工具&#xff0c;redis-dump 1、安装必要环境 yum -y install zlib-devel openssl-devel2、安装redis-dump 安装ruby&#xff1a; ruby下载地址&#xff1a;https://www.ruby-lang.org/zh_cn/downloads/ 我下载的是 2.5.0 版本…

2024(最新)前端面試題----歡迎補充

HTML、css相關。 HTML5新特性 1、增强了表单&#xff0c;input新增了一些type&#xff1a;color----定义调色板tel-----定义包含电话号码的输入域email—定义包含email地址的输入域search–定义2、搜索域number–定义包含数值的输入域date----定义选取日、月、年的输入域 3、Vi…

Elasticsearch(11) intervals的使用

elasticsearch version 7.10.1 在Elasticsearch中&#xff0c;intervals查询是用来做复杂的区间表达式匹配的&#xff0c;它可以基于分析过的文本字段执行一系列复杂的关系运算。intervals查询特别适合于那些需要对文本数据进行模式匹配&#xff0c;而不只是单一词汇匹配的情况…

动态规划课堂6-----回文串问题

目录 引言&#xff1a; 例题1&#xff1a;回文子串 例题2&#xff1a;回文串分割IV 例题3&#xff1a;分割回文串II 例题4&#xff1a;最长回文子序列 例题5&#xff1a;让字符串成为回文串的最小插入次数 引言&#xff1a; 回文字符串 是正着读和倒过来读一样的字符串。…

【周赛】第385场周赛

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 【1】100212.统计前后缀下标对 100212. 统计前后缀下标对 Ihttps://leetcode.cn/problems/count-prefix-and-suffix-pairs-i/ 熟…

4.1_4 文件的物理结构

文章目录 4.1_4 文件的物理结构&#xff08;一&#xff09;文件块、磁盘块&#xff08;二&#xff09;文件分配方式——连续分配&#xff08;三&#xff09;文件分配方式——链接分配&#xff08;1&#xff09;链接分配——隐式链接&#xff08;2&#xff09;链接分配——显式链…

OpenStack之存储cinder

一、 存储 1、DAS 1)存储更多的依赖服务器主机操作系统进行数据的IO读写和存储维护管理&#xff0c;数据备份和恢复要求占用服务器主机资源&#xff08;包括CPU、系统IO等&#xff09; 2)直连式存储与服务器主机之间的连接通道通常采用SCSI连接&#xff0c;随着服务器CPU的处…

Type-C接口介绍

1、USB介绍 &#xff08;1&#xff09;标准USB A型连接器&#xff08;左&#xff09;及B型连接器&#xff08;右&#xff09; 引脚1 VCC&#xff08;5V&#xff09; 引脚2 Data- 引脚3 Data 引脚4 接地 &#xff08;2&#xff09;Micro USB 引脚定义及OTG (USB-HOST) …

QT 多线程使用以及注意事项

Qt 是一个跨平台的 C 应用程序开发框架&#xff0c;提供了丰富的库和工具&#xff0c;用于开发图形用户界面、网络应用、数据库应用等。Qt 中的多线程支持使得开发者可以方便地在应用程序中实现并发执行的功能。 以下是一个简单的使用 Qt 多线程的代码例程&#xff1a; #inclu…

单片机实践:开发板上运行AES128防盗算法

本章内容主要是在开发板上运行AES128防盗算法&#xff0c;并且通过串口调试助手观测防盗算法加密后的值以及解密后的值&#xff0c;判断防盗算法是否在开发板上正确运行。 1&#xff0c;防盗算法 以下为AES128防盗算法源码&#xff1a; aes.h文件源码 #ifndef _AES_H_ #def…

mvcc介绍

前提&#xff1a;在介绍mvcc之前&#xff0c;先简单介绍一下mysql事务的相关问题&#xff0c;mvcc归根结底是用来解决事务并发问题的&#xff0c;当然这个解决不是全部解决&#xff0c;只是解决了其中的一部分问题&#xff01; mysql事务 一、事务的基本要素&#xff08;ACID&a…

k8s CKA upgrade - Kubeadm 版本升级实测

升级版本最好是逐步去升级&#xff0c;不要跨越多个大版本&#xff0c;可能会出错 大体流程&#xff1a; 1.先确定升级版本 2.升级kubeadm 3.驱逐节点 4.升级kubelet和kubectl 5.重启kubelet服务 6.恢复节点&#xff0c;使其上线 1.查看现版本&#xff1a;升级版本 kubectl ge…

python从入门到精通(十五):python爬虫完整学习大纲

一、基础知识 爬虫的基本概念和工作原理。 HTTP 协议和网页结构。 Python 爬虫开发的基础库&#xff0c;如 requests、BeautifulSoup 等。 常见的反爬虫机制和应对方法。 二、爬虫逆向的技术 代理服务器和 IP 封锁突破。 用户代理和请求头模拟。 JavaScript 解析和执行。 验证码…

华为配置Hotspot2.0无线网络示例

配置Hotspot2.0无线网络示例 组网图形 图1 配置Hotspot2.0无线网络组网图 组网需求配置思路配置注意事项操作步骤配置文件 组网需求 某网络服务商在原有移动网络业务的基础上&#xff0c;新增部署WLAN网络接入业务&#xff0c;为用户提供更好的网络体验。但传统的WLAN网络业…

React/RN组件避免重复渲染的一些技巧

组件基础 回顾下React中创建组件的几种方式&#xff1a; ES5的React.createClass方式ES6的React.Component方式无状态的函数组件方式带hooks的函数组件方式 这里我们只讨论Component和函数组件。我们知道Component是否发生重渲染是由shouldComponentUpdate决定的&#xff0c;…

【每日一题】2024年3月汇编(上)

3.1【2369】检查数组是否存在有效划分 2369. 检查数组是否存在有效划分https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/ 1.这样的判断可以用动态规划来解决&#xff0c;用一个长度为(n1) 的数组来记录 是否存在有效划分&#xff0c;dp[i]…

乘法-逆矩阵

文章目录 1. 矩阵相乘-4种方式1.1 CAB1.2 AX 列组合1.3 XB 行组合 2. A,AB, A T A^T AT的逆3. 高斯消元法求 A − 1 A^{-1} A−1 1. 矩阵相乘-4种方式 1.1 CAB 假设我们要求得矩阵CAB &#xff0c;可以用如下公式表示 c i j ∑ k 1 N a i k b k j (1) c_{ij}\sum_{k1}^Na_…

Bean的作用域、Bean的自动装配、注解自动装配 (Spring学习笔记五)

1、Bean 的作用域 官网上显示有六种 1、Bean的作用域默认的是singleton&#xff08;单例模式的实现&#xff09; 也可以显示的设置&#xff08;单例模式的实现&#xff09; <!--用scope可以设置Bean的作用域--><bean id"user2" class"com.li.pojo.Us…

如何实现分词

分词&#xff08;Tokenization&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一个基本步骤&#xff0c;特别是在构建搜索引擎时&#xff0c;它将文本拆分成单词、短语或其他有意义的元素&#xff08;称为“词素”或“tokens”&#xff09;。对于中文文本来说&…