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 24 Python
Python的gevent框架的入门教程
Apr 29 Python
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
python实现字符串加密成纯数字
Mar 19 Python
python tkinter基本属性详解
Sep 16 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
Feb 23 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
写好Python代码的几条重要技巧
May 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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
ThinkPHP添加更新标签的方法
2014/12/05 PHP
php实现zip文件解压操作
2015/11/03 PHP
php中static 静态变量和普通变量的区别
2016/12/01 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
2017/10/22 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
Python简单实现区域生长方式
2020/01/16 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
介绍一下write命令
2012/09/24 面试题
先进个人获奖感言
2014/01/24 职场文书
小班幼儿评语大全
2014/04/30 职场文书
2014年团工作总结
2014/11/27 职场文书
python源码剖析之PyObject详解
2021/05/18 Python