专栏首页逆向技术Python精简代码实现循环左移循环右移

Python精简代码实现循环左移循环右移

Python实现循环左移右移

一丶Python实现循环左移 右移 原理

1.1 Python实现循环左移

1.1.1 文字原理介绍

循环左移原理 拿一个32位的数(4个字节)来说 进行移动八位 如: 0x12345678 rol 8 之后 = 0x34567812 其原理如下: 1.首先左移八位得到 0x345678 2.然后右移24位得到 0x12 最后 0x345678 | 0x12 = 0x34567812 鉴于Python的特殊性.我们只需要32bit数即可. 也就是最后要 & 0xFFFFFFFF 其它移位同理

1.2 Python实现循环右移

1.2.1 右移位原理介绍

​ 设你要移动的数 是一个 4字节(32bit)的数 要移动八位 则原理如下: 0x12345678 ror 8(bit) = 0x78123456

1.首先得到 123456 也就是 >> 8位即可得到 2.然后得到 78 也就是 << 24位即可得到 得到的两个值进行|运算 也就是 0x78 | 0x 123456 = 0x78123456 0x78 | 0x 123456 = 0x78123456 但是python的特殊性 你移位之后数值不会溢出,所以我们只需要相应位数的字节即可. 也就是我们只要32位(4个字节) 最后&0xFFFFFFFF 就可以 得到我们想要的数值的

二丶代码示例

2.1 代码介绍

上面说了下移位的原理那么这里介绍下Python代码的使用

以循环右移为例子 总共就分为下类三个函数

rorCustomByte       自定义定制字节移位 
rorCustomBit        自定义Bit移位
ror8bit             按照8位数值 进行移位

下面说下什么意思

2.2 完成Python代码

__author__ = 'IBinary blob https://www.cnblogs.com/ibinary/'

class RorObj():
    def __init__(self):
        pass
    #字节循环移位
    #参数1 要移动的值
    #参数2 值是多少个字节
    #参数3 要移动的字节位数
    def rorCustomByte(self,v, Byte, shiftByte):
        shiftByte = (shiftByte * 4) & (Byte * 4 - 1)  # 按照bit值 来进行设置移动位数
        if shiftByte == 0:
            return v
        a1 = (v >> (shiftByte))  # 右移shift位 空出高位shift位
        a2 = (v << ((Byte * 4) - shiftByte))  # 计算出剩下要移动的位数
        _ = '0x' + 'F' * Byte
        FfValue = int(_, 16)
        value = (a2 | a1) & FfValue
        return value

        # 循环右移n位
        # 参数1 要移动的值
        # 参数2 你的这个是是多少位的. 比如 0x12345678 就是32位
        # 参数3 你要移动多少位 比如 4位  那么移动之后就是 0x81234567

    def rorCustomBit(self, v, Bytebit, shift):
        shift &= (Bytebit - 1)  # 按照bit值 来进行设置移动位数
        if shift == 0:
            return v
        a1 = (v >> shift)  # 右移shift位 空出高位shift位
        a2 = (v << ((Bytebit) - shift))  # 计算出剩下要移动的位数
        l = [x for x in range(4, Bytebit + 1) if x % 4 == 0]
        LCount = len(l)
        _ = '0x' + 'F' * LCount
        FfValue = int(_, 16)
        value = (a2 | a1) & FfValue
        return value
    def ror4Bit(self, v, shift):
        shift &= 3
        if shift == 0:
            return v
        return ((v >> shift) | (v << (4 - shift))) & 0xF
    def ror8Bit(self,v, shift):
        shift &= 7
        if shift == 0:
            return v
        return ((v >> shift) | (v << (8 - shift))) & 0xFF
    def ror12Bit(self,v, shift):
        shift &= 11
        if shift == 0:
            return v
        return ((v >> shift) | (v << (12 - shift))) & 0xFFF
    def ror16Bit(self,v, shift):
        shift &= 15
        if shift == 0:
            return v  # value 右移shift位
        return ((v >> shift) | (v << (16 - shift))) & 0xFFFF
    def ror20Bit(self,v, shift):
        if shift == 0:
            return v  # value 右移shift位
        return ((v >> shift) | (v << (20 - shift))) & 0xFFFFF
    def ror24Bit(self,v, shift):
        shift &= 23
        if shift == 0:
            return v  # value 右移shift位
        return ((v >> shift) | (v << (24 - shift))) & 0xFFFFFF
    def ror28Bit(self,v, shift):
        if shift == 0:
            return v  # value 右移shift位
        return ((v >> shift) | (v << (28 - shift))) & 0xFFFFFFF
    def ror32Bit(self,v, shift):
        shift &= 0x1F  # 设置要移动的位数
        if shift == 0:
            return v  # value 右移shift位
        return ((v >> shift) | (v << (32 - shift))) & 0xFFFFFFFF
class RolObl():
    def __init__(self):
        pass

    # 循环左移原理
    # 拿一个32位的数(4个字节)来说 进行移动八位
    # 如:
    # 0x12345678  rol 8 之后  = 0x34567812
    # 其原理如下:
    # 1.首先左移八位得到 0x345678
    # 2.然后右移24位得到 0x12
    # 最后 0x345678 | 0x12  = 0x34567812
    # 鉴于Python的特殊性.我们只需要32bit数即可. 也就是最后要 & 0xFFFFFFFF
    # 其它移位同理
    def rolCustomBit(self,v,bit,shift):
        shift &= (bit-1)
        if shift == 0:
            return v
        HightBit = v >> (bit - shift)
        LowBit = v << shift
        l = [x for x in range(4, bit + 1) if x % 4 == 0]
        LCount = len(l)
        _ = '0x' + 'F' * LCount
        FfValue = int(_, 16)

        Value = (HightBit | LowBit) & FfValue
        return Value

    #按照字节移位
    def rolCustomByte(self,v,Byte,shiftByte):
        shiftByte = (shiftByte * 4) & (Byte * 4 - 1)  # 按照bit值 来进行设置移动位数
        if shiftByte == 0:
            return v
        Low = (v << (shiftByte))  #左移shift位
        Hight = (v >> ((Byte * 4) - shiftByte))  # 计算出剩下要移动的位数
        _ = '0x' + 'F' * Byte
        FfValue = int(_, 16)
        value = (Hight | Low) & FfValue
        return value

    def rol4Bit(self,v,shift):
        shift &= 3
        if shift == 0:
            return  v
        HightBit = v >> (4 - shift)
        LowBit =  v << shift
        Value = (HightBit | LowBit) & 0xF
        return Value
    def rol8Bit(self,v,shift):
        shift &= 7
        if shift == 0:
            return  v
        HightBit = v >> (8 - shift)
        LowBit =  v << shift
        Value = (HightBit | LowBit) & 0xFF
        return Value

    def rol12Bit(self, v, shift):
        shift &= 11
        if shift == 0:
            return v
        HightBit = v >> (12 - shift)
        LowBit = v << shift
        Value = (HightBit | LowBit) & 0xFFF
        return Value

    def rol16Bit(self, v, shift):
        shift &= 15
        if shift == 0:
            return v
        HightBit = v >> (16 - shift)
        LowBit = v << shift
        Value = (HightBit | LowBit) & 0xFFFF
        return Value

    def rol20Bit(self, v, shift):
        if shift == 0:
            return v
        HightBit = v >> (20 - shift)
        LowBit = v << shift
        Value = (HightBit | LowBit) & 0xFFFFF
        return Value

    def rol24Bit(self, v, shift):
        shift &= 23
        if shift == 0:
            return v
        HightBit = v >> (24 - shift)
        LowBit = v << shift
        Value = (HightBit | LowBit) & 0xFFFFFF
        return Value

    def rol28Bit(self, v, shift):
        if shift == 0:
            return v
        HightBit = v >> (28 - shift)
        LowBit = v << shift
        Value = (HightBit | LowBit) & 0xFFFFFFF
        return Value
    def rol32bit(self,v,shift):
        shift &= 0x1F
        if shift == 0:
            return v
        HightBit = v >> (32 - shift)
        LowBit = v << shift
        value = (HightBit | LowBit) & 0xFFFFFFFF
        return value

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C语言实现数组的循环左移,右移,翻转

    morixinguan
  • 89 - Python一行代码实现循环移位

    若尘_
  • 10分钟教你用Python做个打飞机小游戏超详细教程

    这次还是用python的pygame库来做的游戏。关于这个库的内容,读者可以上网了解一下。本文只讲解用到的知识。代码参考自网上,自己也做了一点代码简化。尽量把最...

    用户1621951
  • 10分钟教你用Python做个打飞机小游戏超详细教程

    这次还是用python的pygame库来做的游戏。关于这个库的内容,读者可以上网了解一下。本文只讲解用到的知识。代码参考自网上,自己也做了一点代码简化。尽量把最...

    短短的路走走停停
  • 在向量化NumPy数组上进行移动窗口操作

    今天很有可能你已经做了一些使用滑动窗口(也称为移动窗口)的事情,而你甚至不知道它。例如:许多编辑算法都是基于移动窗口的。在GIS中做地形分析的大多数地形栅格度量...

    deephub
  • 一个没有对手的英雄是什么体验?如何在你的Python游戏中添加反派

    在本系列的前几篇文章(请参阅第1部分,第2部分,第3部分和第4部分)中,您学习了如何使用Pygame和Python在尚未出现的空白游戏世界中构建可玩角色。但是,...

    五月Rambo
  • 小题目大智慧

    元旦三天小长假,很多小伙伴肯定都无心学习,想假期好好出去嗨一嗨,但是,放松之余也别忘了学习python哦。

    stormwen
  • 《剑指 offer》刷题记录之:位运算

    位运算是把数字用二进制表示之后,对每一位上 0 或者 1 的运算。位运算总共包括以下 5 种:

    口仆
  • 树莓派综合项目2:智能小车(六)黑线循迹

    树莓派综合项目2:智能小车(二)tkinter图形界面控制,实现了本地图形界面控制小车的前进后退、转向和原地转圈。

    张国平
  • Python实现80后童年经典游戏:坦克大战

    FC红白机上的“经典90坦克大战”是不少80后童年的集体回忆(暴露年龄了)。今天我们就分享一个用Python制作的仿“坦克大战”小游戏。

    Crossin先生
  • 树莓派综合项目2:智能小车(六)黑线循迹

      阅读本篇文章前建议先参考前期文章: 树莓派基础实验34:L298N模块驱动直流电机实验,学习了单个电机的简单驱动。 树莓派综合项目2:智能小车(一)四轮...

    张国平
  • 用 Python 实现打飞机,让子弹飞吧!

    安装好 pygame 在第一次使用 pygame 的时候,pyCharm 会自动 install pygame。

    猫咪编程
  • LeetCode3 一题学会尺取算法

    我们先从最简单的方法开始,最容易想到的算法就是暴力枚举。我们可以遍历出这个字符串当中所有的子串,之后再判断这个子串当中有没有出现重复的元素。如果没有重复的元素,...

    TechFlow-承志
  • 用Python编写一个打乒乓球小游戏

    Python功能十分强大,从科学计算到人工智能,当然Python还可以编写游戏代码喔,虽然不是主流,但是是否应该了解一下呢?茶余饭后,编写一个很有趣的小游戏,编...

    测试小兵
  • [一]基础类型概述

    https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

    noteless
  • 在编程中发现数学之美——使用Python小龟绘制多边形

    在使用数学知识画出很酷的各种图形之前,你需要先学习Python编程语言的基础知识。本文将会带你熟悉以下编程概念:循环、变量、函数、使用小龟模块绘制图像。本文假设...

    fanzhh
  • 列表元素循环移位中Python切片的妙用

    之前有个文章中介绍了列表循环移位的3中方法,原文请见:Python序列循环移位的3种方法 其中第二种方法虽然更直接地翻译了题目的要求,但是显得还是有点啰嗦,如...

    Python小屋屋主
  • Day47:求1+2+3+……+n

    思路一:   众所周知,我们学的等差数列求和:1+2+3+……+n=(1 + n)*n/2=(n+n^2)/2,这里我们可以用到一个math库中的pow()函...

    一计之长
  • 用Python实现谷歌的小恐龙游戏:p

    让我们来依次定义一下这些游戏元素类。对于云,路面以及仙人掌来说,定义起来很简单,我们只需要加载对应的游戏元素图片:

    Crossin先生

扫码关注云+社区

领取腾讯云代金券