机器对移位运算的看法

article/2025/11/7 2:14:45

1.先说一个运算口诀叫“左乘右除”,如k<<1==>k*2; k>>1==>k/2;

2.左移
先看左移运算,因为相对于右移较为简单;
x向左移动K位,会丢弃最高的K位,并在右端补K个0,移位运算是从左到右课结合的,所以x<<j<<k等价于(x<<j)<<k;

3.右移
而对于右移运算,x>>K,一般而言,机器支持俩种右移方式,逻辑右移和算术右移,逻辑右移在左端补K个0,而算术右移在左端补K个最高有效位的值,这种方式对于有符号的运算是非常有效的,

来看一个数据:
在这里插入图片描述

斜体的数值表示位刚填充的数值;可以看到除一个条目外,其余都是补0,唯一的不同是算术右移的【10010101】,因为操作数的最高位位1,所以补1;

但是C标准并未定义有符号数要使用那种运算方式,这就意味着任何假设一种或者另一种右移形式的代码都会影响到代码的可移植性,然而,所有的机器组合都对有符号数使用算术右移,并且程序员也会假设使用这种方式;另一方面,对于无符号数,右移必须是逻辑运算;

但是对于Java来说,就与明确的定义,x>>k,表示使用算术运算右移k,而逻辑运算表示为x>>>k;

还有一种情况是:当K值很大,已经超出了int类型的取值范围,这时应该怎么办?(在32位系统中)
其实C语言已经给这种情况做了规避,当移动K位时,移位指令只考虑位移量的低log2(K),当K为32时,相当于移位0,K位34时,相当于移位2;但是这种方法在C语言中时没有保证的,就是这种方式没有被C严格规定;

先来了解一下什么是位模式,后边会用到,
我们都知道,计算机内存里只能存储0和1俩种数字,这就需要把别的数据都转换成二进制数字,在根据计算机所能存储的容量来决定最小的存储单元进行存储,这是位模式的存储方式;所以可以将位模式理解为就是计算机存储不同数据的一种数据表示方法;

再来了解一个东西,数学术语中的双射,后边会用到;
是指一个函数( F() )有俩面,将数值x映射为数值y,就是y=F(x),对于y,有唯一一个数x使等式成立;这里的y和x反向操作也同样成立,这种方式理解为双射;
在这里插入图片描述
需要注意的是,不同的机器对long的取值范围有不同的规定;图中显示,负数的取值范围会比正数的大1,那么,为什么会这样?这时候会引伸出另外一个问题,负数怎么表示?

4.补码编码
计算机表示负数的方式就是补码,在这个定义中,将字的最高有效位解释为字权,用函数B2T(ω)表示,二进制转补码;公式:
在这里插入图片描述
ω为4时,也就是长度设为4,可以取到极值,
最小值是TMin(4) = B2T(4)([1000])= -2^3=-8;
最大值是TMax(4) = B2T(4)([0111]);

111转为10进制为7,这就是负数的取值范围为什么会比正数大1的理论基础:有一半的位模式(符号位设置为1的数)表示负数,而另一半(符号位设置为0的数)表示非负数。因为0是非负数,就意味着能表示的整数比负数少一个;

可以看出来B2T(ω)是一个长度从w的位模式到TMin(w)和TMax(w)之间数字的映射,同无符号表示一样,在可表示的取值范围内的每个数字都有唯一一个ω位的补码编码,这就导出了与无符号数相似的补码原理:补码编码的唯一性;

函数T2B(ω)作为B2T(ω)的反函数,对于每个数x,满足TMin(ω)<=x<=TMax(ω);
则T2Bω(x)是x的ω位模式;

C 语言允许无符号数和有符号数之间的转换,大多数系统遵循的原则是底层的位保持不变;在一台采用补码的机器上,当从无符号数转换成有符号数时,就是应用函数U2Tω,从有符号数转换成有符号数时,应用函数T2Uω;ω表示数据类型的位数;


http://chatgpt.dhexx.cn/article/dr0tBE9S.shtml

相关文章

定点运算——位移运算

位移运算 前提&#xff1a;下述的移位运算推理过程是建立在合理的移位运算基础上的&#xff0c;即移位运算的结果和实际运算结果一致 位移运算的数学意义 位移运算&#xff0c;相当于小数点的移动&#xff0c;对数值进行扩大或者缩小进制数倍 左移运算&#xff0c;小数点右移…

【逻辑位移和算数位移】

<< 运算符 && >> 运算符 正数位移 当 x>>n 中 x 为正数时&#xff0c;会将x的所有位右移x位&#xff0c;同时左边高位补0 显而易见&#xff0c;运算结束后&#xff0c;值为1 。 可知右移n位&#xff0c;结果就是 x / 2^n&#xff1a;7 / 2 ^2 1;…

算术位移和逻辑位移(一篇懂)

位运算程序员的基本功&#xff0c;但是不得不说这一块儿确实挺让人头疼的。不过还好&#xff0c;你遇到了我&#xff0c;哈哈... 文章目录 必备知识算术移位逻辑移位用例子说话总结 必备知识 计算机是以二进制方式来进行运算的,也就是0和1 。所有数据必须转化成0、1代码计算机才…

矩阵乘测试显卡算力

由于pytorch和tensorflow不支持int8 int16的gemm&#xff0c;因此只能测试fp32 fp16 bf16等精度的tflops&#xff0c;如果要测试int8 int16精度下的数值&#xff0c;需要编写cublas脚本&#xff0c;目前不会CUDA编程&#xff0c;可参考大佬的脚本&#xff1a; cuBLAS矩阵乘法性…

逻辑运算和位移指令

逻辑运算指令 AND OR NOT XOR TEST 逻辑位移指令 SHL SHR 算术位移指令 SAL SAR 小循环位移指令 ROL ROR 大循环位移指令 RCL RCR AND 逻辑与指令 汇编格式&#xff1a;AND 目的操作数&#xff0c;源操作数 执行操作&#xff1a;&#xff08;目的操作数&#xff09;&…

Java 移位操作符

如有理解错误的地方&#xff0c;希望大家能够指正。 移位操作符在以前的开发中并没有使用过&#xff0c;估计在日常的开发中也很少会用到&#xff0c;所以记录下来&#xff0c;以后需要的时候方便查阅。 基本概念 Java里面的移位操作符总共有以下三种&#xff1a; 左移操作符 …

java移位操作示例

java移位操作示例 public class Shift4JTest {/***移位操作符有>>&#xff08;右移&#xff09;、<<&#xff08;左移&#xff09;、>>>&#xff08;右移&#xff09;* >>是带符号右移&#xff0c;负数高位补1&#xff0c;正数高位补0* <<左…

Java 移位运算详解

个人网站&#xff1a;生命不息 折腾不止 1、左移运算符&#xff1a;<< 先随便定义一个int类型的数int&#xff0c;十进制的value 733183670&#xff0c;转换成二进制在计算机中的表示如下&#xff1a; value << 1&#xff0c;左移1位 左移1位后换算成十进制的…

java移位运算_Java移位运算符 “

详解 首先举一个样例来说明不是循环移位&#xff1a; 假设上面的程序改为 i 3L << 63 程序的结果仍然为 1000000000000000000000000000000000000000000000000000000000000000 那么就说明Java中的移位运算不是循环的。 那对上面的问题又怎么解释呢&#xff1f; 在JLS(Jav…

java中的移位操作详解

移位运算&#xff0c;这是一个陌生又熟悉的操作。陌生是指不易理解且不常用&#xff0c;熟悉是指“别人家的开发工程师”在代码中经常使用这种方式进行高低位的截取、哈希计算、乘除法的运算&#xff0c;今天&#xff0c;让我们一起来揭开移位运算的神秘面纱。 Java提供了两种…

html 右侧滑动条取消,滚动条可以设置取消吗?

网页中的滚动条可以取消&#xff0c;下面我们就来看一下隐藏网页中滚动条的方法&#xff1a; 1、使用以下CSS可以隐藏滚动条&#xff1a;.container::-webkit-scrollbar {display:none} 但是要兼容其他浏览器的话这个就不太好用了&#xff0c;这个适用于Chrome 2、为了兼容其他…

html网页设计滚动条怎么设置,css怎么设置滚动条?

在我们HTML页面中经常会用到滚动条来优化我们的HTML页面&#xff0c;那么我们该如何设置滚动条呢&#xff1f;下面我们来看一下使用css设置滚动条的方法。 一、我们可以使用overflow属性设置是否出现滚动条overflow:scroll /* x y 方向都会*/ 或者 overflow-x:scroll /*只是x方…

element的表格设置及滚动条的设置

element的Table 表格 1.通过使用elementUI中的表格&#xff0c;达到我们需要的效果&#xff0c;其中包括对滚动条的修改&#xff0c;以及文字颜色修改等… 2.先看效果&#xff0c;是可以滚动的 HTML <div class"content_table"><el-table :data"tab…

改变滚动条样式

在我们开发网页项目中往往会遇到滚动条&#xff0c;然而滚动条原本的样式太丑了&#xff0c;所以要改变滚动条的样式&#xff0c;让滚动条和我们开发的项目更加的美观更加的好看&#xff1b; 案例&#xff1a; <div style"width: 200px; height: 200px;overflow: aut…

网页中滚动条的设置和修改

一、通过css设置滚动条 在所有浏览器&#xff0c;滚动条可定制性最强的当属webkit内核的浏览器了。因为源代码开放的原因&#xff0c;市面上基于webkit内核的浏览器也是很难穷举完。例如有&#xff1a;Google Chrome、Opera&#xff08;opera最近宣布使用webkit内核了&#xf…

如何设置页面滚动条

:root {::-webkit-scrollbar {width: 7px;height: 5px;background: #fff;border-radius: 5px; /*外层轨道*/}::-webkit-scrollbar-thumb {display: block;width: 2px;margin: 0 auto;border-radius: 5px;background: #ccc; /*内层轨道*/transition: all .2s ease-in-out;} } 设…

设置滚动条样式

1.全局设置 ::-webkit-scrollbar {width: 4px;height: 4px; }::-webkit-scrollbar-thumb {border-radius: 5px;-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);background-color: #99a9bf; }::-webkit-scrollbar-track {-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2…

div:给div加滚动条 div的滚动条设置

今天做了个例子&#xff1a; div 的滚动条问题&#xff1a; 两种方法&#xff1a; 一、 <div style" overflow:scroll; width:400px; height:400px;”></div> 记住宽和高一定要设置噢&#xff0c;否则不成的 不过在不超出时&#xff0c;会有下面的滚动条&…

浏览器滚动条css样式设置,看这一篇文章就够了!

一 前言 在CSS 中&#xff0c;如果我们在块级容器上设置了属性: overflow:scroll /* x y 方向都会*/ 或者 overflow-x:scroll /*只是x方向*/ 或者 overflow-y:scroll /*只是y方向*/当块级内容区域超出块级元素范围的时候&#xff0c;就会以滚动条的形式展示&#xff0c;你可…

滚动条如何设置样式和滚动条悬浮显示与隐藏

文章目录 一、滚动条如何设置样式1&#xff1a;滚动条的默认样式&#xff08;如下图&#xff09;1&#xff1a;html代码2&#xff1a;css代码3&#xff1a;效果图 2&#xff1a;CSS设置滚动条的属性&#xff08;重点&#xff09;3&#xff1a;设置滚动条的例子1&#xff1a;css…