彻底理解位运算——左移、右移

article/2025/9/17 23:49:31

相信大家在各种语言各种框架中都能看到二进制的操作。左移、右移、&、|、^等等操作。那么这篇帖子让各位彻底弄懂左移、右移。

首先先区分那个是左移、那个是右移,这很简单,从箭头指向的方向来区分。<<左移>>右移

左移:

很简单的来说就是把当前的二进制,整体往左边移动N个单位,N取决于你的表达式。

那么用一个例子,和画图来理解一下吧。

32 << 1 = 64。32左移一位,答案为64。那么下面就画图来理解一下吧。
32用二进制的表示

把32的二进制(蓝色部分)整体往左边移动一位。得到下图。

32左移一位后得到的结果

0100 0000二进制转换成十进制为64。所以答案为64.

那么再来一道题目,我们用之前的题目小改一下把。

32 << 2 = 128,答案为128。那么下面还是用画图来理解一下吧。 

32用二进制表示为

把32的二进制部分(蓝色部分)向左边移动2个单位得到下图

二进制1000 0000转换成十进制为128。

那么每次左移运算都这么麻烦,都要把十进制转换成二进制,移动以后,再从二进制转换成十进制,这也太麻烦了。所以我们需要找到其中的规律。

规律为:源操作数 * 2的N次方(N取决于移动的位数) = 移动后的结果。

32 << 2  = 32 * 2^2  = 128

16 << 4 = 16 * 2^4  =  256

7 << 2 = 7 * 2^2 = 28

以此类推......

右移:

很简单的来说,把当前的二进制,整体往右边移动N的单位,得到一个新的二进制。

还是用例子+画图来理解把。

32 >> 1 16。32右移一位,答案为16。那么下面就画图来理解一下吧。

把0010 0000 蓝色部分整体往右边移动,这样本来是6个二进制来表示,变成了5个二进制来表示,还有一位已经被右移移走了。

所以得到0001 0000 将其转换成十进制为16。

12 >> 4 0。12右移四位,答案为0。那么下面就画图来理解一下吧。

 把0000 1100 右移4位,就把最后4位给移出去了,刚好最后4位1100表示为12。右移后得到 0000 0000所以最后答案算出来为0.

那么我们来找一下规律

规律为:源操作数 / 2的N次方(N取决于移动的位数) = 移动后的结果(只取整数部分)

32 >> 2  = 32 / 2^2  = 8

17 >> 2 = 17 / 2^2 = 4.25 = 4(因为只取整数部分

512 >> 10 = 512 / 2^10 = 0.5 = 0(因为只取整数部分

为什么位运算的效率很高

本想从汇编层面和intel开发手册层面来寻找资料来论证位运算的效率。但是在汇编中左移和右移也就是一个指令,跟加减乘除一样都是一个指令。而对应的指令在intel开发手册中的解释也没说效率方面,只告诉开发者如何使用这些指令(也可以能笔者能力欠佳,没有找到)。

但是从宏观方面来分析,不管是左移还是右移,从上面得出来的规律都知道,如果不使用左移和右移,他们的计算步骤要被拆分为几步,而一个运算就是CPU的一个指令执行周期,而左移和右移只需要移动N个二进制,这样就会比直接使用左移和右移多几个指令执行周期,可能运算比较少的时候,差异不大。但是大规模运算中使用位运算的优势就出现了。

大家应该都明白,系统开发和硬件开发都是使用C和汇编进行开发,他们的效率高在哪里了?少了很多高级的封装,减少了编译的次数,基本是面向CPU指令集的编程。而位运算也可以这样去类比。对于计算机的底层而言都是由二进制组成,二进制的计算更偏向底层计算。

总结

最后,如果本帖对您有一定的帮助,希望能点赞+关注+收藏!您的支持是给我最大的动力,后续会一直更新各种框架的使用和框架的源码解读~!


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

相关文章

汉诺塔

2019独角兽企业重金招聘Python工程师标准>>> 伪算法&#xff1a; 如果是1个盘子 直接将A柱子上的盘子从A移到C 否则 先将A柱子上的n-1个盘子借助C移到B <?php function hannuota($n,$a,$b,$c){if ($n1) {echo 盘子 .$n. 直接从柱子 .$a. 移动到柱子 .$c.<br/…

汉诺塔Java递归实现

2019独角兽企业重金招聘Python工程师标准>>> 算法逻辑&#xff1a; 利用递归&#xff0c;当n为1时为递归出口&#xff0c;通过改变柱子的位置实现 当只有一个盘子时是从a&#xff08;初始&#xff09;->c&#xff08;目的&#xff09; 当有n个盘子时 先 &#x…

汉诺塔------java算法

这其实是一个递归问题&#xff0c;下面是用Java对汉诺塔的实现。 源代码&#xff1a; 方式一&#xff1a; import java.util.Scanner;/***BelongsProject: javaSenior*BelongsPackage: PACKAGE_NAME*Author: 48-zj*CreateTime: 2023-04-13 22:09*Description: TODO*Version:…

数据结构与算法之递归

直接或间接地调用自身的算法称为递归算法。 通过这种递推关系把原来问题缩小成一个更小规模的同类问题&#xff0c;并延续这一缩小规模的过程&#xff0c;直到在某一规模上&#xff0c;问题的解是已知的。这样一种解决问题的思想我们称为递归的思想。 常见题目1&#xff1a; …

递归详解-斐波那契、汉诺塔、青蛙跳台阶、字符串长度

递归-斐波那契数列 这里我们讲解一下 斐波那契数列的经典递归问题。 斐波那契数列&#xff1a; 1 1 2 3 5 8 13 21 34… 从第三个数字开始&#xff0c;下一个数字等于前面两个数字之后&#xff0c;有点像我们数学的数列 n(x-1)n(x-2) 那如果我们要求第n个数字&#xff0c;应该…

HDU - 1995 汉诺塔V 难度:递归入门 复杂度:有点复杂

方案一&#xff08;公式法&#xff09; 我还不清楚用递归来解汉诺塔问题是怎么解&#xff0c;对递归比较陌生&#xff0c;但后来发现这题可以不用递归&#xff0c;套用下面发现的公式即可。 一个盘 1号1次 两个盘 1号2次 2号1次 三个盘 1号4次 2号2次 3号1次 四个盘…

【Python学习】Python解决汉诺塔问题

摘要&#xff1a; 参考文章&#xff1a;http://www.cnblogs.com/dmego/p/5965835.html 一句话&#xff1a;学程序不是目的&#xff0c;理解就好&#xff1b;写代码也不是必然&#xff0c;省事最好&#xff1b;拿也好&#xff0c;查也好&#xff0c;解决问题就好&#xff01; 信…

C++ 汉诺塔程序实现

2019独角兽企业重金招聘Python工程师标准>>> 首先不看代码&#xff0c;汉诺塔解题步骤有三步&#xff08;设A->C&#xff09;&#xff0c;先将汉诺塔看成两部分n-1,1(n-1在上面) 第一&#xff1a;将A中的n-1个盘借助C移到B >Hanoi(n-1,a,c,b); 第二&#xff…

【算法与数据结构】汉诺塔

数据结构里的汉诺塔&#xff0c;递归的典型代表&#xff0c;几乎讲到递归都会讲到汉诺塔&#xff0c;今天才把汉诺塔看明白&#xff0c;惭愧啊。 不废话了&#xff0c;贴代码&#xff0c;基本思想在注释里有&#xff0c;话说往CNBLOG首页投了两次&#xff0c;两次都被小编给扯下…

递归-汉诺塔

2019独角兽企业重金招聘Python工程师标准>>> 递归&#xff08;recursion&#xff09;&#xff1a;程序调用自身的编程技巧。 反复执行的过程&#xff08;调用自身&#xff09;有跳出反复执行过程的条件&#xff08;递归出口&#xff09; import com.lifeibigdata.al…

汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 前提说明&#xff1a; ‍算法&#xff1a;当只有一个盘子的时候&#xff0c;只需要从将A塔上的一个盘子移到C塔上。 当A塔上有两个盘子是&#xff0c;先将A塔上的1号盘子&#xff08;编号从上到下&#xff09;移动到B塔上…

JavaScript算法实现之汉诺塔(Hanoi)

目前前端新手&#xff0c;看到的不喜勿喷&#xff0c;还望大神指教。 随着Node.js&#xff0c;Angular.js,JQuery的流行&#xff0c;点燃了我学习JavaScript的热情&#xff01;以后打算每天早上跟晚上抽2小时左右时间将经典的算法都用JS来实现&#xff0c;加快学习JS的步伐&…

【C语言】递归的经典问题(模拟strlen,阶乘,斐波那契数列,汉诺塔,青蛙跳台阶)

以下我分享的是关于C语言递归的比较经典的题&#xff0c;有些题提供了多种解法&#xff0c;希望可以帮助你打开思路&#xff0c;如果你有更多的解法&#xff0c;欢迎评论区留言哟~ 目录 一、输入1234&#xff0c;输出1 2 3 4 二、模拟strlen功能 1&#xff09;递归 2&…

7.递归-汉诺塔

汉诺塔问题&#xff1a; 如果求解的汉诺塔是3层&#xff0c;可以先将上面的两层看作是一个整体。先将两层经过c作为中介移动到b&#xff0c;再将第三个圆盘直接移动到c。然后再将b上面的两个圆盘移动到c&#xff0c;通过a为中介。 算法分析&#xff08;递归算法&#xff09; 我…

数据结构与算法之汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 一、汉诺塔问题 1.汉诺塔问题 起源&#xff1a;一位法国数学家曾编写过一个印度的古老传说&#xff1a;在世界中心贝拿勒斯的圣庙里&#xff0c;一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候&#xff…

汉诺塔 最优算法设计商量

2019独角兽企业重金招聘Python工程师标准>>> 引言 汉诺塔算法一向是算法设计科目标最具代表性的研究题目&#xff0c;本文存眷于如何设计多柱汉诺塔最优算法的商量。最简单的汉诺塔是三个柱子&#xff08;A、B、C&#xff09;&#xff0c;是以多柱汉诺塔的柱子个数M…

函数递归与汉诺塔

C初阶之函数递归 函数递归基本原理 什么是递归&#xff1f;程序调用自身的编程技巧称为递归recursion。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0c;…

分治算法的解和幂乘算法及其优化以及汉诺塔算法的介绍

分治算法就是分成若干个和原问题一样性质的子问题&#xff0c;然后逐步递归这些子问题&#xff0c;直到遇到规模很小的子问题&#xff0c;求出子问题的解&#xff0c;归结成原问题的解的算法就是分治算法 分治算法为递归问题&#xff0c;可以用来解决快排、二分归并、斐波那契数…

递归求解汉诺塔问题(详细解答)

汉诺塔移动步数的计算 具体汉诺塔的规则大家自行百度吧&#xff0c;就不介绍了&#xff0c;这里介绍一下如何求解汉诺塔移动步数的计算思想。 当汉诺塔层数为一层时&#xff0c;很显然只需要一步&#xff0c;直接从A杆移动到C杆 当层数为两层时&#xff0c;则需要三步&#x…

汉诺塔算法

2019独角兽企业重金招聘Python工程师标准>>> 有A、B和C 3跟柱子&#xff0c;在A上从下往上按照从小到大的顺序放着64个圆盘&#xff0c;以B为中介&#xff0c;把盘子全部移动到C上。移动过程中&#xff0c;要求任意盘子的下面要么没有盘子&#xff0c;要么只能有比它…