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之hello world
May 21 Python
Python批量按比例缩小图片脚本分享
May 21 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
python中学习K-Means和图片压缩
Nov 20 Python
tensorflow 1.0用CNN进行图像分类
Apr 15 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
python实现requests发送/上传多个文件的示例
Jun 04 Python
Python找出微信上删除你好友的人脚本写法
Nov 01 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
python tkinter实现下载进度条及抖音视频去水印原理
Feb 07 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
3.从实例开始
2006/10/09 PHP
用来解析.htgroup文件的PHP类
2012/09/05 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
vuejs如何配置less
2017/04/25 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
Python的Tornado框架异步编程入门实例
2015/04/24 Python
python网络应用开发知识点浅析
2019/05/28 Python
Python错误的处理方法
2020/06/23 Python
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
语文教育专业推荐信范文
2013/11/25 职场文书
公积金转移接收函
2014/01/11 职场文书
求职简历自我评价范例
2014/03/12 职场文书
中式婚礼主持词
2014/03/13 职场文书
团代会主持词
2014/04/02 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
中等生评语大全
2014/05/04 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
2014年收银工作总结
2014/11/13 职场文书
2014年保管员工作总结
2014/11/18 职场文书
开票员岗位职责
2015/02/12 职场文书
2015年班组长工作总结
2015/04/10 职场文书
python基础之文件操作
2021/10/24 Python