Python-位操作( &、 | 、^、~ 、>>、 <<)

本文深入探讨了位操作的基本概念及在Python中的具体应用,包括按位与、按位或、逐位取反、异或、左移和右移等运算符的功能与使用场景。特别介绍了如何利用位操作高效计算整数二进制补码中1的个数,并提供了多种实现方法的代码示例。

用于提高运算速度,规避算术运算符。

在位操作运算中,不应该试图考虑先得到一个数的二进制码,而应该将这个数看作是一个二进制码,二进制补码与整数之间是一一对应的。诚然 Python语言中有内置函数  bin将一个整数转换为二进制,Python中使用该函数转换为负数并不是其补码。因此不能先得到该数的二进制码。同时绞尽脑汁得到一个数的二进制补码是没有必要的。

&:按位与操作,只有 1 &1 为1,其他情况为0。可用于进位运算。

|:按位或操作,只有 0|0为0,其他情况为1。

~:逐位取反。

^:异或,相同为0,相异为1。可用于加操作(不包括进位项)。

<<:左移操作,2的幂相关

>>:右移操作,2的幂相关

判断一个整数的二进制补码中 1 的个数:

  既然一个整数在计算机内部为二进制的补码,那么直接对整数进行位操作即可,没有必要进行进制的转换。

  1)将整数通过移位并与1进行与操作,即可判断当时末尾是否为1.但是由于整数以二进制补码的方式存储,正数右移与负数右移得到的效果并不相同,负数在右移过程中会自动补 1 .由于在c 或c++这种语言中数据的类型要先声明,如 int为32位,而在python中,由于动态语言的特性,数据的位数理想上是不受限制的,因此可通过 移位的次数进行判断,int型数据移位不能超过32即可,这样程序的循环次数恒定为32.

 1 class Solution:
 2     def NumberOf1(self, n):
 3         # write code here
 4         m = 0
 5         result = 0
 6 
 7         while m < 32:
 8             if n & 1:
 9                 result += 1
10             n = n >> 1
11             m += 1
12         return result 

  2):同样的,可以通过左移 1 再与输入值进行与操作进行判断。仍然是由于Python不会存在溢出现象,因此需要用到 数据类型的位数,进行限制。

 1 class Solution():
 2     def getResult(self, n):
 3         m = 1
 4         result = 0
 5         i = 0
 6 
 7         while i < 32:
 8             i += 1
 9             if m&n :
10                 result += 1
11             m = m << 1
12         return result

  3)一个二进制减一再于自身与操作能够将最后一位1置零。如 1011-1 = 1010 1010&1011 = 1010、1010-1 = 1001 1001 & 1010 = 1000、1000-1 = 0111 0111 &1000 = 0000

但是,Python不会溢出,因此负数在进行持续减一 的运算,若通过当前值是否为0进行循环终止条件会导致死循环。因此需要为正负数分别设定终止条件。

 1 class Solution2():
 2     def getResult(self, n):
 3         result = 0
 4         if n >= 0:
 5             while n:
 6                 result += 1
 7                 n = (n - 1)&n
 8         else:
 9             while n >=  -2147483648:
10                 result += 1
11                 n = (n - 1)&n     
12         return result

  4):一个负数必然对应一个正数,先通过加法运算得到负数的相反数,这样可以将负数当作正数进行操作,唯一不同的是,负数的符号位要多一个 1

 1 # -*- coding:utf-8 -*-
 2 class Solution:
 3     def NumberOf1(self, n):
 4         # write code here
 5         result = 0
 6 
 7         if n < 0:
 8             n = n + (1<<31)
 9             result += 1
10         result += bin(n)[2:].count('1')
11         return result

  5):结合方法 4 与 3之前的方法:

 1 # -*- coding:utf-8 -*-
 2 class Solution:
 3     def NumberOf1(self, n):
 4         # write code here
 5         result = 0
 6 
 7         if n < 0:
 8             n = n + (1<<31)
 9             result += 1
10         while n:
11             result += 1
12             n = n&(n-1)
13         return result

 

转载于:https://www.cnblogs.com/JYNNO1/p/10525649.html

&lt;think&gt;好的,我现在需要帮助用户了解Python中的各种运算符的用法。用户提到的运算符包括:+、-、*、**、/、//、%、@、&lt;&lt;、&gt;&gt;、&amp;、|^~、:=、&lt;、&gt;、&lt;=、&gt;=、==、!=。我需要逐一解释这些运算符的用途,并提供示例。同时,我需要参考用户提供的引用内容,尤其是引用[3]中的赋值运算符和引用[4]中的计算器实现思路,以及引用[1]和[2]中的位运算符和比较运算符。 首先,我应该将运算符分类,比如算术运算符、比较运算符、位运算符、赋值运算符等。这样结构更清晰。根据引用[3],Python中有多种赋值运算符,如+=、-=等,需要详细说明。而引用[1]提到了位运算符,如&amp;、|^~&lt;&lt;、&gt;&gt;,这些需要单独解释。引用[2]讨论了比较运算符,如==、!=、&lt;、&gt;等,这些也需要覆盖。 接下来,我需要检查每个运算符的正确用法,确保LaTeX格式符合要求,行内公式用$...$,独立公式用$$...$$。例如,在讲解幂运算符**时,可以写成$x**y$表示$x^y$。另外,需要确保所有示例代码正确,使用中文注释或说明。 用户可能对某些运算符不熟悉,比如@运算符(用于矩阵乘法)或:=(海象运算符),需要特别说明它们的应用场景。例如,海象运算符在Python 3.8引入,可以在表达式内部赋值,这在循环或条件判断中很有用。 另外,要注意引用文献的位置,比如在讲到位运算符时,可以引用[^1],在赋值运算符部分引用[^3],比较运算符引用[^2]。同时,用户提供的引用中有一些示例代码,可以适当参考,但不要直接复制,而是用自己的话解释。 最后,生成相关问题时要覆盖不同类别运算符的用法、区别以及实际应用,比如位运算与逻辑运算的不同,海象运算符的使用场景等。确保问题有针对性,帮助用户深入理解。 现在,我需要组织内容,先概述运算符的分类,再逐一详细说明每个运算符的用法和示例,最后列出相关问题。保持结构清晰,语言简洁,符合用户要求的中文回答。&lt;/think&gt;### Python运算符详解 Python运算符可分为七大类:算术运算符、比较运算符、赋值运算符、位运算符、逻辑运算符、身份运算符和成员运算符。以下按分类详细说明常用运算符的用法: --- #### 一、算术运算符 1. **基本运算** - `+`:加法,如 `3 + 2 = 5` - `-`:减法或取负,如 `5 - 3 = 2`,`-x` - `*`:乘法,如 `3 * 2 = 6` - `/`:除法,结果为浮点数,如 `6 / 3 = 2.0` - `//`:整除,结果为整数,如 `7 // 3 = 2` - `%`:取余,如 `7 % 3 = 1` - `**`:幂运算,如 `2 ** 3 = 8`(即$2^3$) - `@`:矩阵乘法(需配合`numpy`库使用),如 `A @ B` 2. **示例** ```python print(5 ** 2) # 输出25,即$5^2$ print(7 // 2) # 输出3 ``` --- #### 二、比较运算符 用于比较值的关系,返回布尔值`True/False`: - `==`:等于,如 `3 == 3 &rarr; True` - `!=`:不等于,如 `3 != 5 &rarr; True` - `&gt;`:大于,`&lt;`:小于,`&gt;=`:大于等于,`&lt;=`:小于等于 示例:`5 &gt; 3 &rarr; True`[^2] --- #### 三、赋值运算符 用于变量赋值,包括复合赋值运算符: - `=`:基本赋值,如 `x = 5` - `+=`、`-=`、`*=`等:复合运算,如 `x += 3` 等效于 `x = x + 3`[^3] 示例: ```python a = 10 a **= 2 # a = 100 ``` --- #### 四、位运算符 操作二进制位: - `&amp;`:按位与,如 `0b1010 &amp; 0b1100 = 0b1000`(十进制8) - `|`:按位或,如 `0b1010 | 0b1100 = 0b1110`(14) - `^`:按位异或,如 `0b1010 ^ 0b1100 = 0b0110`(6) - `~`:按位取反,如 `~0b1010 &rarr; -11`(补码运算) - `&lt;&lt;`:左移,`&gt;&gt;`:右移,如 `4 &lt;&lt; 2 = 16`(即$4 \times 2^2$)[^1] --- #### 五、其他运算符 1. **海象运算符 `:=`** 在表达式内赋值(Python 3.8+),如: ```python if (n := len([1,2,3])) &gt; 2: print(n) # 输出3 ``` 2. **身份运算符** `is` 和 `is not`:判断对象内存地址是否相同。 3. **成员运算符** `in` 和 `not in`:判断元素是否存在于容器中。 --- #### 六、运算符优先级 优先级从高到低示例: $$ 2 + 3 * 4 ** 2 \quad &rarr; \quad 2 + (3 \times (4^2)) = 50 $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值