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设计模式编程之桥接模式的运用
Mar 02 Python
Python多线程爬虫简单示例
Mar 04 Python
如何在Python函数执行前后增加额外的行为
Oct 20 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 Python
Python 2/3下处理cjk编码的zip文件的方法
Apr 26 Python
selenium处理元素定位点击无效问题
Jun 12 Python
Python Pandas 获取列匹配特定值的行的索引问题
Jul 01 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
python中 _、__、__xx__()区别及使用场景
Jun 30 Python
通过代码实例了解Python3编程技巧
Oct 13 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
Oct 30 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上传大文件设置方法
2016/04/14 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
用JS写的一个TableView控件代码
2010/01/23 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
关于layui表单中按钮自动提交的解决方法
2019/09/09 Javascript
原生js实现购物车功能
2020/09/23 Javascript
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
通过实例解析python and和or使用方法
2020/11/14 Python
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
opencv实现图像几何变换
2021/03/24 Python
药学专业大学生自荐信
2013/09/28 职场文书
环卫工作汇报材料
2014/10/28 职场文书
教师业务学习材料
2014/12/16 职场文书
小学四年级学生评语
2014/12/26 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
代码复现python目标检测yolo3详解预测
2022/05/06 Python