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实现的二维码生成小软件
Jul 11 Python
python在控制台输出进度条的方法
Jun 20 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
Feb 20 Python
python中删除某个元素的方法解析
Nov 05 Python
python利用dlib获取人脸的68个landmark
Nov 27 Python
Python3监控疫情的完整代码
Feb 20 Python
在python中修改.properties文件的操作
Apr 08 Python
python 将视频 通过视频帧转换成时间实例
Apr 23 Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
浅谈python中的多态
Jun 15 Python
浅谈Python数学建模之线性规划
Jun 23 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下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
web页面和微信小程序页面实现瀑布流效果
2018/09/26 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
跟老齐学Python之重回函数
2014/10/10 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
Python 如何对文件目录操作
2020/07/10 Python
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
比驿:全球酒店比价网
2018/06/20 全球购物
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
外语专业毕业生个人的自荐信
2013/11/19 职场文书
就业自荐信
2013/12/04 职场文书
大学毕业通用个人的求职信
2013/12/08 职场文书
高校十八大报告感想
2014/01/27 职场文书
公司节能减排方案
2014/05/16 职场文书
群众路线表态发言材料
2014/10/17 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
社团个人总结范文
2015/03/05 职场文书