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的Django框架的dj-scaffold项目
May 30 Python
Python 专题三 字符串的基础知识
Mar 19 Python
Python常见MongoDB数据库操作实例总结
Jul 24 Python
Python列表对象实现原理详解
Jul 01 Python
python正则表达式匹配不包含某几个字符的字符串方法
Jul 23 Python
把vgg-face.mat权重迁移到pytorch模型示例
Dec 27 Python
CentOS7下安装python3.6.8的教程详解
Jan 03 Python
python 瀑布线指标编写实例
Jun 03 Python
基于keras中的回调函数用法说明
Jun 17 Python
python让函数不返回结果的方法
Jun 22 Python
Python用户自定义异常的实现
Dec 25 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 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中使用Oracle数据库(5)
2006/10/09 PHP
PHP memcache扩展的三种安装方法
2009/04/26 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
js调试系列 初识控制台
2014/06/18 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
Python中的filter()函数的用法
2015/04/27 Python
python3中zip()函数使用详解
2018/06/29 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
python函数与方法的区别总结
2019/06/23 Python
python Django的web开发实例(入门)
2019/07/31 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
文秘个人求职信范文
2014/04/22 职场文书
机关干部个人对照检查材料思想汇报
2014/09/28 职场文书
2016年清明节红领巾广播稿
2015/12/17 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
oracle覆盖导入dmp文件的2种方法
2021/05/21 Oracle
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python