python移位操作困惑

1.在使用python进行移位操作的时候发现python进行移位操作后的数值与其他语言不一样(java,php,javascript),然后google了下
 看到了这篇帖子http://www.cnblogs.com/zhengyun_ustc/archive/2009/10/14/shifting.html,然后又看了看python移位操作与php语言移位操作的原理,python是被移位数乘以2的移位数目的次方

例,

1000<<1 = 1000*pow(2,1) = 2000

2,php进行<<操作

  <<运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

语法格式:
  需要移位的数字 <<
移位的次数
  例如: 3 << 2,则是将数字3左移2位

计算过程:
3 <<
2
  首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000
0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000
0000 0000 0000 0000
1100,则转换为十进制是12.数学意义:
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。

3.为什么python进行<<操作会有与其他语言不同的情况

例,

python

1000<<25 = 33554432000L

php

1000 << 25 = -805306368

为什么会有不同的结果,

  原来是因为python是int类型是无精度类型,不会发生溢出而进行截取的情况,php在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移
动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就
是移动66次和移动2次得到的结果相同。

4,让python实现和php一样移位运算结果

  一,十进制转二进制然后进行移位操作


def shifting(string_num):
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord(‘A‘),ord(‘A‘)+6)]
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 2)
mid.append(base[rem])
temp = ‘‘.join([str(x) for x in mid[::-1]])
s1 = temp.zfill(32)
s2 = s1[5:]+"0"*5
s3 = bin2dec(s2)
return s3

  二,二进制转十进制

def bin2dec(string_num):
return str(int(string_num, 2))

python移位操作困惑,布布扣,bubuko.com

时间: 2024-11-03 03:44:39

python移位操作困惑的相关文章

关于Python编程的一些问答

关于Python编程的一些问答 导语 大约1个月前,oschina.net和华章图书一起合作做了一个活动:OSC第51期高手问答--聊聊python那些事,来推广我参与撰写的书<编写高质量代码:改善Python程序的91个建议>(豆瓣链接).在回答问题的过程中,我看到有若干问题是好几个人都问了的,就萌发了在事后把这些问答整理整理的想法,以下内容就是来自那一次的问答.为简化整理,已经去掉了提问人的昵称,并做了简单的分类. 纠结的Py2与Py3之选 Q:Python 3 会导致Python的什么前

【Python笔记】剖析Python的切片(slicing)语法

相信即使是Python新手也很容易理解下面的切片行为: >>> s = 'this_is_a_test' >>> s[1 : 5] 'his_' 进一步,下面的语法及输出也很不难理解: >>> s = 'this_is_a_test' >>> s[ : : 2] 'ti_sats' 那么,下面的呢? >>> s = 'this_is_a_test' >>> s[ : : -1] 'tset_a_si

一句话搞定python六剑客

六剑客 一行搞定六剑客:三个函数:map filter reduce + lambda 切片 推导列表 python最有特点的一行代码,所有代码均可以借用一行代码(目标) 1.map(函数,列表或者字符串)#字符串或者列表中每个字符或每个元素都带入函数运算 1.map函数: 输出结果为列表 1)列表元素的map运算, >>> map(s,[1,2,3]) [2, 3, 4] 2)字符串元素的map运算,函数用lambda实现 >>> map(lambda x:x.upp

python字节码(转)

了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的. 如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代码文件--它们的名字以 .py 结尾.你可能还看到过其它类型的文件,比如以 .pyc 结尾的文件,或许你可能听说过它们就是 Python 的 "字节码bytecode" 文件.(在 Python 3 上这些可能不容易看到 -- 因为它们与你的 .py 文件不在同一个目录下,它们在一个叫 _

python logging模块可能会令人困惑的地方

python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调用,而每个文件设置了对应的logging方式不同,可能会产生的令人困惑的现象. 下面以自己在开发的时候遇到的问题作为叙述的背景: 有三个python模块A.B.C.主模块A会import B和C模块,主模块有对应的logging方式, A使用logging的模块的方式为: import loggin

用python计算lda语言模型的困惑度并作图

转载请注明:电子科技大学EClab——落叶花开http://www.cnblogs.com/nlp-yekai/p/3816532.html 困惑度一般在自然语言处理中用来衡量训练出的语言模型的好坏.在用LDA做主题和词聚类时,原作者D.Blei就是采用了困惑度来确定主题数量.文章中的公式为: perplexity=exp^{ - (∑log(p(w))) / (N) } 其中,P(W)是指的测试集中出现的每一个词的概率,具体到LDA的模型中就是P(w)=∑z p(z|d)*p(w|z)[z,d

python中sys.argv的说明(读《python简明教程》的困惑解答)

在阅读<python简明教程>的时候,第8章.14章有对sys模块的使用,其中关于sys.argv的说明有一点困惑,让自己思索了好久,后来才恍然大悟,在这里分享一下我所理解到的,以便于和我有一样困惑的python学习者能够更好的理解. 以下代码来自于<python简明教程>8.1: 例8.1 使用sys模块 #!/usr/bin/python # Filename: using_sys.py import sys print 'The command line arguments

[Python]可变类型,默认参数与学弟的困惑

一.学弟的困惑 十天前一个夜阑人静.月明星稀的夜晚,我和我的朋友们正在学校东门的小餐馆里吃着方圆3里内最美味的牛蛙,唱着最好听的歌儿,畅聊人生的意义.突然,我的手机一震,气氛瞬间就安静下来,看着牛蛙碗里三双贪婪的筷子,我犹豫了:不——我的肉…但是本着不让人久等的原则,我不舍地放下了筷子.点亮屏幕,我的眉头不禁紧锁,事情好像并不简单… 什么,还上升到了去医院的程度?现在的年轻人怎么了,怎么那么不注意安全,嗨,真是一届不如一届了,不过也好,没受伤就好…正当我沉浸在我自己的瞎想时,一张图片紧接着医院那

python学习之那些由print引起的困惑

该文索所起之因:在练习列表的操作时,要输出一波操作后的列表,但是一直让本人耿耿于怀的时下边的这个现象: 红色框框里是字符串,黄色框框里是列表,同样是只对一个元素进行的操作,为啥输出时字符串是作为一个整体输出,而列表却输出了一个"None",什么情况?于是多次实验,不管是remove还是extent等等,都输出一个"None"."None""None""None"你就只会一个"None"吗