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 字符串操作实现代码(截取/替换/查找/分割)
Jun 08 Python
pygame播放音乐的方法
May 19 Python
Python使用BeautifulSoup库解析HTML基本使用教程
Mar 31 Python
Python使用当前时间、随机数产生一个唯一数字的方法
Sep 18 Python
Python自动化运维之IP地址处理模块详解
Dec 10 Python
python实现的读取网页并分词功能示例
Oct 29 Python
Python 读取 YUV(NV12) 视频文件实例
Dec 09 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 Python
python利用faker库批量生成测试数据
Oct 15 Python
python3实现无权最短路径的方法
May 12 Python
从np.random.normal()到正态分布的拟合操作
Jun 02 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
SONY ICF-SW7600的电路分析
2021/03/02 无线电
PHP的类 功能齐全的发送邮件类
2006/10/09 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
vue+elementUI实现简单日历功能
2020/09/24 Javascript
简单介绍Python中的round()方法
2015/05/15 Python
python九九乘法表的实例
2017/09/26 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
柏林通行证:Berlin Pass
2018/04/11 全球购物
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
美术指导求职信
2014/03/17 职场文书
应急处置方案
2014/06/16 职场文书
庆祝国庆节标语
2014/10/09 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
浅析MySQL如何实现事务隔离
2021/06/26 MySQL
python 详解turtle画爱心代码
2022/02/15 Python