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 多进程通信模块的简单实现
Feb 20 Python
python多线程用法实例详解
Jan 15 Python
Python实现比较两个文件夹中代码变化的方法
Jul 10 Python
Python paramiko模块的使用示例
Apr 11 Python
PYTHON基础-时间日期处理小结
May 05 Python
对Python中list的倒序索引和切片实例讲解
Nov 15 Python
python中退出多层循环的方法
Nov 27 Python
python try 异常处理(史上最全)
Mar 07 Python
Python socket模块方法实现详解
Nov 05 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 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 编写的日历
2006/10/09 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP中spl_autoload_register函数的用法总结
2013/11/07 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
JS读取XML文件示例代码
2013/11/15 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
python实现高斯(Gauss)迭代法的例子
2019/11/20 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
毕业生实习鉴定
2013/12/11 职场文书
餐厅筹备计划书
2014/04/25 职场文书
孩子教育的心得体会
2014/09/01 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
教师远程培训心得体会
2016/01/09 职场文书
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python