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使用cStringIO实现临时内存文件访问的方法
Mar 26 Python
探究Python的Tornado框架对子域名和泛域名的支持
May 02 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
PyQt5每天必学之单行文本框
Apr 19 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 Python
Python可变参数会自动填充前面的默认同名参数实例
Nov 18 Python
使用Python实现 学生学籍管理系统
Nov 26 Python
Django 实现对已存在的model进行更改
Mar 28 Python
基于jupyter代码无法在pycharm中运行的解决方法
Apr 21 Python
python飞机大战游戏实例讲解
Dec 04 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处理json时中文问题的解决方法
2011/04/12 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
php实现留言板功能
2017/03/05 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
2019/05/09 PHP
jquery退出each循环的写法
2014/02/26 Javascript
浅谈javascript中的DOM方法
2015/07/16 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
Vue异步加载about组件
2017/10/31 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
Python 忽略warning的输出方法
2018/10/18 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
详解python中各种文件打开模式
2020/01/19 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
python 调用Google翻译接口的方法
2020/12/09 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
经典c++面试题三
2015/07/08 面试题
家居设计专业个人自荐信范文
2013/11/26 职场文书
运动会入场解说词
2014/02/07 职场文书
jquery插件实现悬浮的菜单
2021/04/24 jQuery
详解Oracle块修改跟踪功能
2021/11/07 Oracle
python程序的组织结构详解
2021/12/06 Python
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫
JavaScript获取URL参数的方法分享
2022/04/07 Javascript