python的移位操作实现详解


Posted in Python onAugust 21, 2019

因为要将js的一个签名算法移植到python上,遇到一些麻烦。

int无限宽度,不会溢出

算法中需要用到了32位int的溢出来参与运算,但是python的int是不会溢出的,达到界限后会自己转为long,所以很麻烦。

#使用-342686650:
ret = 123456789 << 20
print(ret)
得到结果129453825982464
print(bin(ret))
这个二进制是11101011011110011010001010100000000000000000000
明显已经超出32位了

在JS上
document.writeln(123456789 << 20);
得到结果是-783286272
这就是溢出后截取的,

在python上想实现溢出效果,找到一个函数
#这个函数可以得到32位int溢出结果,因为python的int一旦超过宽度就会自动转为long,永远不会溢出,有的结果却需要溢出的int作为参数继续参与运算
def int_overflow(val):
  maxint = 2147483647
  if not -maxint-1 <= val <= maxint:
    val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1
  return val
ret = int_overflow(123456789 << 20)
print(ret)
print(bin(ret))
现在得到结果是-783286272
二进制:-101110101100000000000000000000

负数使用无符号右移>>>

在JS中,可以使用 a>>>b来实现无符号位移,python中没有这个运算符,只能自己实现了

无符号右移>>>,就是将有符号int a和b转为无符号uint后,再进行普通右移>>运算

比如-1的有符号int就是-1,无符号int就是4294967295

我们自己实现>>>可以这样

#无符号右移
import ctypes
def unsigned_right_shitf(n,i):
  # 数字小于0,则转为32位无符号uint
  if n<0:
    n = ctypes.c_uint32(n).value
  # 正常位移位数是为正数,但是为了兼容js之类的,负数就右移变成左移好了
  if i<0:
    return -int_overflow(n << abs(i))
  #print(n)
  return int_overflow(n >> i)

ret = unsigned_right_shitf(-1,20)
print(ret)

结果等于4095

和JS上执行 -1 >>> 20 一样。

附赠sdbm hash算法的python实现

import ctypes
# equ <<
def int_overflow(val):
  maxint = 2147483647
  if not -maxint-1 <= val <= maxint:
    val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1
  return val
# equ >>>
def unsigned_right_shitf(n,i):
  # 数字小于0,则转为32位无符号uint
  if n<0:
    n = ctypes.c_uint32(n).value
  # 正常位移位数是为正数,但是为了兼容js之类的,负数就右移变成左移好了
  if i<0:
    return -int_overflow(n << abs(i))
  #print(n)
  return int_overflow(n >> i)
def hash_sdbm(string):
  hash = 0
  for i in range(len(string)):
    hash = ord(string[i]) + (int_overflow(hash << 6)) + (int_overflow(hash << 16)) -hash
  val = unsigned_right_shitf(hash,0)
  return val
a = hash_sdbm('hello')
print(a)
# result:684824882

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用reportlab画图示例(含中文汉字)
Dec 03 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
Python中return self的用法详解
Jul 27 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
利用python画出AUC曲线的实例
Feb 28 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
浅谈pytorch中的BN层的注意事项
Jun 23 Python
Python 如何对文件目录操作
Jul 10 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
Python中快速掌握Data Frame的常用操作
Mar 31 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 #Python
Python+OpenCv制作证件图片生成器的操作方法
Aug 21 #Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 #Python
django自带serializers序列化返回指定字段的方法
Aug 21 #Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 #Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 #Python
Python Django 简单分页的实现代码解析
Aug 21 #Python
You might like
用php和MySql来与ODBC数据连接
2006/10/09 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
过滤掉PHP数组中的重复值的实现代码
2011/07/17 PHP
为你总结一些php系统类函数
2015/10/21 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
基于jQuery的获取标签名的代码
2012/07/16 Javascript
js中this的用法实例分析
2015/01/10 Javascript
浅谈js中的闭包
2015/03/16 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
2016/06/14 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python探索之自定义实现线程池
2017/10/27 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
踏青活动策划方案
2014/08/19 职场文书
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android