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使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 Python
python比较两个列表是否相等的方法
Jul 28 Python
Python金融数据可视化汇总
Nov 17 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 Python
Python实现的FTP通信客户端与服务器端功能示例
Mar 28 Python
对python中两种列表元素去重函数性能的比较方法
Jun 29 Python
Python实现将Excel转换成xml的方法示例
Aug 25 Python
PyTorch的SoftMax交叉熵损失和梯度用法
Jan 15 Python
Django实现列表页商品数据返回教程
Apr 03 Python
Python configparser模块操作代码实例
Jun 08 Python
python复合条件下的字典排序
Dec 18 Python
教你如何使用Python开发一个钉钉群应答机器人
Jun 21 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二维数组用键名分组相加实例函数
2013/11/06 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
2014/08/20 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
AngularJS模板加载用法详解
2016/11/04 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
2017/12/01 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
js中call()和apply()改变指针问题的讲解
2019/01/17 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
es6中let和const的使用方法详解
2020/02/24 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
python选择排序算法实例总结
2015/07/01 Python
利用Python找出序列中出现最多的元素示例代码
2017/12/08 Python
Python函数中不定长参数的写法
2019/02/13 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
python实现简单成绩录入系统
2019/09/19 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
工作室成员个人发展规划范文
2014/01/24 职场文书
法制演讲稿
2014/09/10 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
整改落实自查报告
2014/11/05 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS