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引用(import)文件夹下的py文件的方法
Aug 26 Python
Python中的匿名函数使用简介
Apr 27 Python
Python中的深拷贝和浅拷贝详解
Jun 03 Python
Python操作Word批量生成文章的方法
Jul 28 Python
Python Web编程之WSGI协议简介
Jul 18 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
Jul 26 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
django自带调试服务器的使用详解
Aug 29 Python
使用Tensorboard工具查看Loss损失率
Feb 15 Python
Python中sys模块功能与用法实例详解
Feb 26 Python
python 元组和列表的区别
Dec 30 Python
使用Python+Appuim 清理微信的方法
Jan 26 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
自动跳转中英文页面
2006/10/09 PHP
给多个地址发邮件的类
2006/10/09 PHP
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
JQuery遍历元素的父辈和祖先的方法
2016/09/18 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
VUE预渲染及遇到的坑
2018/09/03 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
python获取外网IP并发邮件的实现方法
2017/10/01 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
*p++ 自增p 还是p所指向的变量
2016/07/16 面试题
表演方阵解说词
2014/02/08 职场文书
2014年教师党员公开承诺书
2014/05/28 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书