算法通关村第十一关青铜挑战——移位运算详解

news2024/10/4 2:36:11

大家好,我是怒码少年小码。

计算机到底是怎么处理数字的?

数字在计算机中的表示

机器数

一个数在计算机中的二进制表示形式,叫做这个数的机器数。

机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1。比如,十进制中的数+3,计算机字长为8位,转换成二进制就是00000011。如果是-3,就是10000011。这里的 00000011 和 10000011 都是机器数。

真值

将带符号位的机器数对应的真正数值称为机器数的真值。

例如上述-3的机器码10000011的真值是-3而不是131。(10000011换成十进制是131)


计算机对机器数的表示进一步细化:原码, 反码, 补码。

原码

第一位表示符号,其余位表示值。例如如果是八位二进制:

  • [+1] 原 = 0000 0001
  • [-1 ] 原 = 1000 0001

八位二进制有一位用于表示符号,所以原码的表示范围是[-127,127]。

反码

  • 正数的反码是其本身
  • 的反码是在其原码的基础上,符号位不变,其余各位取反。
  • [+1] = [00000001]原 = [00000001]反
  • [-1] = [10000001]原 = [11111110]反

补码

  • 正数的补码就是其本身
  • 负数的补码是在其原码的基础上你,符号位不变,其余各位取反,最后+1(也就是在反码的基础上+1)
  • [+1] = [00000001]原 = [00000001]反 = [00000001]补
  • [-1] = [10000001]原 = [11111110]反 = [11111111]补

看到这里你应该知道一个数在计算机中有三种编码方式。

拓展:反码、补码在人脑无法直观的看出来它的数值,那为啥还要有它们?

答:人脑可以知道第一位是符号位,在计算的时候我们会根据符号位选择对真值区域的加减。但是计算机要辨别"符号位"就必须获得全部的位的数据才可以,显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法。例如:根据运算法则减去一个正数等于加上一个负数。

1+(-1)=[00000001]反 + [11111110]反 = [11111111]反=[10000000]原 = -0

"0"的表示有点奇怪,+0和-0是一样的,而且0带符号是没有任何意义,而且要浪费[0000 0000]原和[10000000]原两个编码来表示0。于是补码的出现,解决了0的符号以及两个编码的问题:

1 + (-1) =[0000 0001]原 + [10000001]原= [00000001]补 + [1111 1111]补= [0000 0000]补=[0000 0000]原

[10000000]表示-128,所以补码的范围是[-128, 127]。(八进制中)

位运算规则

位运算主要有:与、或、异或、取反、左移和右移,其中左移和右移统称位移位运算,移位运算又分为算术移位和逻辑移位。

与运算的符号是&

运算规则:对于每个二进制位,当两个数对应的位都为1时,结果才为1,否则结果为0。

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

或运算的符号是|

运算规则:对于每个二进制位,当两个数对应的位都为0时,结果才为0,否则结果为1

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

异或

异或运算的符号是⊕(代码表示是^)

运算规则:当两个数对应的位相同时,结果为0,否则结果为1

00 = 0
01 = 1
10 = 1
11 = 0 

取反

取反运算的符号是~

运算规则:对一个数的每个二进制位进行取反操作,0变成1,1变成0

~0 = 1
~1 = 0

移位运算

移位运算按照移位方法分类可以分成左移和右移,按照是否带符号分类可以分成算术移位和逻辑移位

  • 原始: 0000 0110 ===> 6
  • 右移一次: 0000 0011 ===> 3 相当于除以2
  • 左移一次: 0000 1100 ===> 12 相当于乘以2

左移运算的符号是<< ,左移运算时,将全部二进制位向左移动若干位,高位丢弃,低位补0。对于左移运算,算术移位和逻辑移位是相同的。
右移运算的符号是>>。右移运算时,将全部二进制位向右移动若干位,低位丢弃,高位的补位由算术移位或逻辑移位决定:

  • 算术右移时,高位补最高位;
  • 逻辑右移时,高位补0
  • 示例1:29的二进制表示是0001 1101。 29左移2位的结果是116,对应的二进制是01110100;29左移3位的结果是-24,对应的二进制是11101000
  • 示例2:-50的二进制表示是11001110(补码)。-50算术右移2位的结果是-13,对应的二进制表示是11110011;-50逻辑右移2位的结果是51,对应的二进制表示是00110011

拓展:计算机内部的右移运算采取的是哪一种?

答:

  • 对于 C/C++ 而言,对于有符号类型,右移运算为算术右移;对于无符 号类型,右移运算为逻辑右移。
  • 对于 Java 而言,不存在无符号类型,所有的表示整数的类型都是有符号类型,因此需要区分算术右移和逻辑右移。在Java中,算术右移的符号是>>,逻辑右移的符号是 >>>。

位运算常用技巧

位运算代码套路

获取

将 1 左移 i 位,得到形如 00010000 的值,接着堆这个值与num执行”位与“操作,从而将i位之外的所有位清零,最后检查该结果是否为零。不为零说明i位为1,否则i位为0。代码如下:

boolean getBit(int num,int i){
	return ((num&(1<<i))!=0);
}

设置

setBit先将1左移i位,得到形如00010000的值,接着堆这个值和num执行”位或“操作,这样只会改变i 位的数据。这样除i位外的位均为零,故不会影响num的其余位。代码如下:

int setBit(int num,int i){
	return num | (1 << i);
}

清零

与setBit相反,将1左移i位获得形如00010000的值,对这个值取反进而得到类似11101111的 值,接着对该值和num执行”位与“,故而不会影响到num的其余位,只会清零i位。

int clearBit(int num,int i){
  int mask = ~(1 << i);
  return num &mask;
}

更新

这个方法是将setBit和clearBit合二为一,首先用诸如11101111的值将num的第i位清零。接着将待写入 值v左移i位,得到一个i位为v但其余位都为0的数。最后对之前的结果执行”位或“操作,v为1这num的i 位更新为1,否则为0:

int updateBit(int num,int i,int v){
 int mask=~(1<<i);
 return (num&mask)|(v<<i);
}

END

说实话,更文到这里其实有点累了,学计算机也有点累了。网上负面消息一大堆,近几年就业形势不好,自己在学的东西也得不到正向反馈,有时候真的觉得自己挺废物的😔。或许看到这的小伙伴也和我有一样的想法,这里我想分享一段翁凯老师的话:

计算机的所有东西都是人做出来的,别人能想得出来的,你也一定能想得出来。在计算机里头没有任何黑魔法,所有的东西只不过是我现在不知道而已,总有一天我会把所有的细节、所有的内部的东西都搞明白了。

这贼船都上了,咱就好好走下去吧😁

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

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

相关文章

【剑指Offer】:删除链表中的倒数第N个节点(此题是LeetCode上面的)剑指Offer上面是链表中的倒数第K个节点

给定一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 示例 3&#xff1a;…

计算机网路第3章-运输层

概述和运输层服务 运输层协议为运行在不同主机上的应用进程提供了逻辑通信&#xff0c;从应用程序角度看&#xff0c;通过使用逻辑通信&#xff0c;就好像运行在不同主机上的进程直接相连在一起一样。 运输层和网络层的关系 网络层提供主机之间的通信&#xff0c;而运输层提…

面试官的一句话,让五年功能测试老手彻夜难眠!

小王是一名软件测试工程师&#xff0c;已经在目前的公司做了四五年的功能测试。虽然一直表现得非常努力&#xff0c;但他还是没能躲过裁员。只能被动跳槽&#xff0c;寻找更好的职业机会。 然而事情并没有像他想象中那样顺利。在多次面试中小王屡屡碰壁&#xff0c;被面试官吐槽…

leetcode:面试题 17.04. 消失的数字(找单身狗/排序/公式)

一、题目&#xff1a; 函数原型&#xff1a;int missingNumber(int* nums, int numsSize) 二、思路&#xff1a; 思路1 利用“找单身狗”的思路&#xff08;n^n0&#xff1b;0^nn&#xff09;&#xff0c;数组中有0-n的数字&#xff0c;但缺失了一个数字x。将这些数字按位异或0…

Antv G6入门之旅--combo图

目录 什么是AntV G6 G6 的特性 G6 文档 安装 1 在项目中使用 NPM 包引入 2 在 HTML 中使用 CDN 引入 使用 Step 1 创建容器 Step 2 数据准备 Step 3 创建关系图 Step 4 配置数据源&#xff0c;渲染 React 中使用 G6 Combo图 什么是AntV G6 G6 是一个图可视化引擎…

深度学习模型不确定性方法对比

©PaperWeekly 原创 作者&#xff5c;崔克楠 学校&#xff5c;上海交通大学博士生 研究方向&#xff5c;异构信息网络、推荐系统 本文以 NeurIPS 2019 的 Can You Trust Your Model’s Uncertainty? Evaluating Predictive Uncertainty Under Dataset Shift 论文为主线…

机器学习笔记 - 特斯拉的占用网络简述

一、简述 ​ 2022 年,特斯拉宣布即将在其车辆中发布全新算法。该算法被称为occupancy networks,它应该是对Tesla 的HydraNet 的改进。 自动驾驶汽车行业在技术上分为两类:基于视觉的系统和基于激光雷达的系统。后者使用激光传感器来确定物体的存在和距离,而视觉系统…

acwing第 126 场周赛 (扩展字符串)

5281. 扩展字符串 一、题目要求 某字符串序列 s0,s1,s2,… 的生成规律如下&#xff1a; s0 DKER EPH VOS GOLNJ ER RKH HNG OI RKH UOPMGB CPH VOS FSQVB DLMM VOS QETH SQBsnDKER EPH VOS GOLNJ UKLMH QHNGLNJ Asn−1AB CPH VOS FSQVB DLMM VOS QHNG Asn−1AB&#xff0c;其…

day10_面向对象_抽象_接口

今日内容 1.作业 2.final 3.抽象 4.接口 零、复习 按从大到小的顺序写出访问修饰符 public > protected > package (default)> private static修饰属性和方法的特点在内存的特点: 在方法区(不是在堆,也不是在栈)初始化的特点: 随类(字节码文件)加载到内存已经初始化使…

基于大数据的时间序列股价预测分析与可视化 - lstm 计算机竞赛

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称&#xff1a; 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &…

Redis不止能存储字符串,还有List、Set、Hash、Zset,用对了能给你带来哪些优势?

文章目录 &#x1f31f; Redis五大数据类型的应用场景&#x1f34a; 一、String&#x1f34a; 二、Hash&#x1f34a; 三、List&#x1f34a; 四、Set&#x1f34a; 五、Zset &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO…

1300*B. Road Construction(构造菊花图)

Problem - 330B - Codeforces 解析&#xff1a; 1到任一点距离不超过二&#xff0c;并且有部分点不可以连边&#xff0c;直接统计所有不能连边的点&#xff0c;从之外的点中选一个点当作中心&#xff0c;构造菊花图即可。 #include<bits/stdc.h> using namespace std; i…

CSS常见选择器总结

1.简单选择器 简单选择器是开发中使用最多的选择器&#xff0c;包含&#xff1a; 元素选择器&#xff0c;使用元素的名称 类选择器&#xff0c;使用.类名 id选择器&#xff0c;使用#id id注意事项&#xff1a; 一个HTML文档里面的id值 是唯一的&#xff0c;不能重复 id值如…

阿里云服务器x86计算架构ECS实例规格汇总

阿里云企业级服务器基于X86架构的实例规格&#xff0c;每一个vCPU都对应一个处理器核心的超线程&#xff0c;基于ARM架构的实例规格&#xff0c;每一个vCPU都对应一个处理器的物理核心&#xff0c;具有性能稳定且资源独享的特点。阿里云服务器网aliyunfuwuqi.com分享阿里云企业…

特约|数码转型思考:Web3.0与银行

日前&#xff0c;欧科云链研究院发布重磅报告&#xff0c;引发银行界及金融监管机构广泛关注。通过拆解全球70余家银行的加密布局&#xff0c;报告认为&#xff0c;随着全球采用率的提升与相关技术的成熟&#xff0c;加密资产已成为银行业不容忽视也不能错过的创新领域。 作为…

尚硅谷kafka3.0.0

目录 &#x1f483;概述 ⛹定义 ​编辑⛹消息队列 &#x1f938;‍♂️消息队列应用场景 ​编辑&#x1f938;‍♂️两种模式&#xff1a;点对点、发布订阅 ​编辑⛹基本概念 &#x1f483;Kafka安装 ⛹ zookeeper安装 ⛹集群规划 ​编辑⛹流程 ⛹原神启动 &#x1f938;‍♂️…

gRPC之gateway集成swagger

1、gateway集成swagger 1、为了简化实战过程&#xff0c;gRPC-Gateway暴露的服务并未使用https&#xff0c;而是http&#xff0c;但是swagger-ui提供的调用服 务却是https的&#xff0c;因此要在proto文件中指定swagger以http调用服务&#xff0c;指定的时候会用到文件 prot…

WebService SOAP1.1 SOAP1.12 HTTP PSOT方式调用

Visual Studio 2022 新建WebService项目 创建之后启动运行 设置默认文档即可 经过上面的创建WebService已经创建完成&#xff0c;添加HelloWorld3方法&#xff0c; [WebMethod] public string HelloWorld3(int a, string b) { //var s a b; return $"Hello World ab{a …

Markdown语法详解

文章目录 [toc] 一、简介二、样式1. 标题2. 字体3. 引用4. 分割线5. 图片6. 超链接7. 列表8. 表格9. 代码 一、简介 以前写学习文档常用的软件都是Word或者CSDN自带的编辑器&#xff0c;但Word用起来不太灵活&#xff0c;而CSDN自带编辑器又感觉逼格不够&#xff08;主要原因&…

(自我剖析一下我博客“问答”中的第三个问题)准确率一直居低不上是什么原因引起的?

我提的问题是&#xff1a; “我使用单层GRU训练minist数据集时&#xff0c;准确率一直处于下图的状态是为什么&#xff1f; 什么原因引起的&#xff1f;” 这种debug就比较难受&#xff0c;因为程序是能跑的&#xff0c;任何“error”都没有出。这就表明在程序中有某些小细节没…