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 排列组合之itertools
Mar 20 Python
python的类方法和静态方法
Dec 13 Python
python实现提取百度搜索结果的方法
May 19 Python
Python随机生成带特殊字符的密码
Mar 02 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
Python实现将HTML转换成doc格式文件的方法示例
Nov 20 Python
Python装饰器知识点补充
May 28 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
Python脚本操作Excel实现批量替换功能
Nov 20 Python
python中Lambda表达式详解
Nov 20 Python
python爬虫实现获取下一页代码
Mar 13 Python
python中numpy.empty()函数实例讲解
Feb 05 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
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
Windows下安装Memcached的步骤说明
2010/04/25 PHP
PHP多进程编程总结(推荐)
2016/07/18 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
php生成word并下载代码实例
2019/03/15 PHP
laravel请求参数校验方法
2019/10/10 PHP
PHP7 错误处理机制修改
2021/03/09 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
jquery animate图片模向滑动示例代码
2011/01/26 Javascript
JS中的substring和substr函数的区别说明
2013/05/07 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
easyui validatebox验证
2016/04/29 Javascript
js HTML5 Canvas绘制转盘抽奖
2020/09/13 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
Python实现针对中文排序的方法
2017/05/09 Python
Python语言描述随机梯度下降法
2018/01/04 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
学校司机岗位职责
2013/11/14 职场文书
揠苗助长教学反思
2014/02/04 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
马智宇结婚主持词
2014/04/01 职场文书
融资租赁计划书
2014/04/29 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript