什么是位运算

位运算就是把数字当成二进制来进行计算,位运算有六种:&(与), |(或), ^(异或), ~(非), <<(左移), >>(右移)

&(与)

&运算规则:两个位都为1,结果为1,否则为0

# &(与)
a = 3
b = 9
print(a & b) # a----0101
# b----1001
# a&b--0001
# a&b=1

## |(或)
|运算规则:两个位至少有一个为1,结果为1,否则为0
```python
# |(或)
a = 3
b = 9
print(a | b)

a----0101

b----1001

a|b--1101

a|b=11


<br>
## ^(异或)
^运算规则:两个位不同,结果为1,否则为0
```python
# ^(异或)
a = 3
b = 9
print(a ^ b) # a----0101
# b----1001
# a^b--1100
# a^b=10

## ~(非)
~运算规则:对所有位取反,1变成0,0变成1
```python
a = 5
print(~a)


猜猜结果是多少?是不是以为是2,哈哈哈
看一下打印结果
```python
-6

what? 检查下计算过程

# a----101
# ~a--010
# ~a=2

按照运算规则,没错啊

这是为什么呢?其实,计算机中是以补码的形式来进行计算的

对于正数:

原码=反码=补码

对于负数:

反码=原码的符号位不变,其余位取反;

补码=反码+1

使用sys.getsizeof可以查看对象在内存空间占用的大小

import sys
a = 5
print(sys.getsizeof(a)) # 28

说明a在内存中占的位数是28

现在我们来一步一步等推算~a

a的二进制形式

0000  00000000  00000000  00000101

由于运算是以补码的形式进行,因此要将原码转化成补码,由于a为整数,因此其补码就等于原码
```python
# a的补码
0000 00000000 00000000 00000101

<br>

对a的补码进行~运算,结果为
```python
# 结果的补码
1111 11111111 11111111 11111010

到这里要注意了,计算机运算的时候是以补码的形式,但是显示到终端上还是以原码的形式,因此我们要把结果再转化回原码

由于结果为负数(符号为1),先把补码转化成反码,反码=补码-1

# 结果的反码
1111 11111111 11111111 11111001

再计算结果的原码

# 结果的原码
1000 00000000 00000000 00000110

再把结果的二进制转化成十进制形式,符号为1说明是负数,-(4+2)= -6,因此结果为-6

上面的计算过程只是让我们对计算机如何进行位运算有一个认识,实际上对于任意数a,~a = -(a+1),根本不用手工转化成二进制计算

## 对于整数a,a<<n等效于 a*2**n,也就是说移位运算可以替代乘法运算

<br>
## >>(右移位)
'>>'的规则:运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数

```python
a = 9
print(a >> 2) # 2

对于整数a,a<<n等效于 int(a/2**n),向右移位可以代替除法运算

python位运算的更多相关文章

  1. python 位运算【实测】

    python 位运算符为  << 左移,>> 右移 3<<2 既 3 的二进制整体向左移两位 : : 可以这么算 3*(2的2次方)= 12 11>> ...

  2. python位运算版的算术四则运算

    #!/usr/bin/python # -*- coding: utf-8 -*- class ElementOperator: def add(self, num1, num2): # 32bits ...

  3. python——位运算之进制转化

    >>> a=0b001100 >>> a 12 >>> b=0o001100 >>> b 576 >>> c= ...

  4. python位运算之计算中位数

    # -*- coding: utf-8 -*- # @Time : 2018/11/23 10:49 PM # @Author : cxa # @File : 1.py # @Software: Py ...

  5. 剑指offer用位运算实现两个数相加,及python相关的位操作

    题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 代码: # -*- coding:utf-8 -*-class Solution:    def Add(self ...

  6. 利用位运算进行a+b的计算(Java&&Python)

    题目链接 需要用到的位运算操作:异或(^).与(&).右移(<<) 异或运算:又称不进位加法,a^b得到的结果为a与b相加,但是需要进位的地方不进位得到的结果 与运算:找出来a和b ...

  7. Python语言中的按位运算

    (转)位操作是程序设计中对位模式或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加 ...

  8. Python 进制转换、位运算

    一.进制转换 编程用十进制,十进制转换为二进制.八进制.十六进制 In [135]: bin(23) Out[135]: '0b10111' In [136]: oct(23) Out[136]: ' ...

  9. jave 逻辑运算 vs 位运算 + Python 逻辑运算 vs 位运算

    JAVA中&&和&.||和|(短路与和逻辑与.短路或和逻辑或)的区别 博客分类: 面试题目 Java.netBlog  转自 :http://blog.csdn.net/web ...

随机推荐

  1. 安卓Q | 诸多本地文件找不到?应用文件存储空间沙箱化适配指导

    上期我们针对Android Q 版本中对设备存储空间进行的限制.新特性变更引发的兼容性问题及原因分析推出了<安卓 Q | 8大场景全面解析应用存储沙箱化>文章,本期文章我们将手把手指导各位 ...

  2. Codeforces Round #555 (Div. 3)[1157]题解

    不得不说这场div3是真的出的好,算得上是从我开始打开始最有趣的一场div3.因为自己的号全都蓝了,然后就把不经常打比赛的dreagonm的号借来打这场,然后...比赛结束rank11(帮dreago ...

  3. Codeforces | CF1029D 【Concatenated Multiples】

    \(qwq\)昨天晚上\(Div.3\)过了这道题...早上交了\(1A\)...看在\(CF\)上\(hack\)的情况并不乐观而且也没人来交这题的份上...我决定发一篇题解帮\((zhuang)\ ...

  4. 「SHOI2014」三叉神经树 解题报告

    「SHOI2014」三叉神经树 膜拜神仙思路 我们想做一个类似于动态dp的东西,首先得确保我们的运算有一个交换律,这样我们可以把一长串的运算转换成一块一块的放到矩阵上之类的东西,然后拿数据结构维护. ...

  5. debian源

    修改debian9 stretch源 修改配置文件/etc/apt/sources.list 修改成163源: deb http://mirrors.163.com/debian/ stretch m ...

  6. 解决zabbix3.4图表显示中文乱码问题

    问题描述: 在Zabbix界面设置中,已经调成中文语言,可能zabbix自身携带的字体还不够完美,出现如下乱码: 测试环境: zabbix 3.4(经测试,目前3.x版本都适用) 解决步骤: 1. 寻 ...

  7. js常见的排序算法

    最近面试可能会问这些 1,插入排序 function sort(elements){ var res =[elements[0]]; for (var i = 0; i < elements.l ...

  8. bzoj3331 压力(圆方树)

    题目链接 圆方树 圆方树就是对于联通无向图中的每一个点双新建一个方点,与点双中的每个点连一条边,然后将原来的边删去.将原来的点看作圆点,新建的点看作方点.所以叫做圆方树. 性质 1.圆方树肯定是棵树( ...

  9. react-native中的style

    在 React Native 中,你并不需要学习什么特殊的语法来定义样式.我们仍然是使用 JavaScript 来写样式. 所有的核心组件都接受名为style的属性.这些样式名基本上是遵循了 web ...

  10. Python函数的定义与调用、返回值、参数

    一.函数是什么 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.比如print(),len()等.但你也可以自己创建函数,这被叫做用户自 ...