位运算
位运算与二进制
位运算(Bit Operation):在计算机内部,数是以「二进制(Binary)」的形式来进行存储。位运算就是直接对数的二进制进行计算操作,在程序中使用位运算进行操作,会大大提高程序的性能。
二进制数(Binary):由 0 和 1 两个数码来表示的数。二进制数中每一个 0 或每一个 1 都称为一个「位(Bit)」。与十进制的「满十进一」进位规则类似,二进制数满足「逢二进一」。
二进制与十进制的转换
二进制转十进制
二进制转换为十进制主要采用"按权相加"法。首先,将二进制数的每一位与对应的2的幂相乘。从最右侧开始,这等于2的0次方,向左每移一位,幂就增加1。然后,将所有的结果相加,得到的总和就是相应的十进制数。如二进制数01101010,可以作:
01101010(2) = 0 * 2^7 + 1 * 2^6 + 1 * 2^5 + 0 * 2^4 + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0=0 + 64 + 32 + 0 + 8 + 0 + 2 + 0 = 106(10)
十进制转二进制
十进制转换为二进制的方法有除二取余法和逆序排列法。
位运算的基础操作规则
运算符
描述
规则
|
按位或运算符
只要对应的两个二进位有一个为 1 时,结果位就为 1。
&
按位与运算符
只有对应的两个二进位都为 1 时,结果位才为 1。
<<
左移运算符
将二进制数的各个二进位全部左移若干位。<< 右侧数字指定了移动位数,高位丢弃,低位补 0。
>>
右移运算符
对二进制数的各个二进位全部右移若干位。>> 右侧数字指定了移动位数,低位丢弃,高位补 0。
^
按位异或运算符
对应的两个二进位相异时,结果位为 1,二进位相同时则结果位为 0。
~
取反运算符
对二进制数的每个二进位取反,使数字 1 变为 0,0 变为 1。
位运算的应用
位运算的基础应用包括:判断整数奇偶、二进制数选取指定位、将指定位设置为1、反转指定位、交换两个数、将二进制最右侧为1的二进位改为0、计算二进制中二进位为1的个数、判断某数是否为2的幂次方……此外,二进制数可以用来枚举子集。
位运算练习题
颠倒二进制位
(1)题目描述
颠倒给定的 32 位无符号整数的二进制位。
(2)输入输出示例
示例 1:
输入:n = 00000010100101000001111010011100输出:964176192 (00111001011110000010100101000000)解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
示例 2:
输入:n = 11111111111111111111111111111101输出:3221225471 (10111111111111111111111111111111)解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。
(3)解题思路
A.初始化结果变量result为0。
B.使用for循环,循环32次(因为一个整数有32位)。
C.在每次循环中,先将result左移一位,然后与n的最低位进行或运算,将n的最低位添加到result的最高位。
D.然后,将n右移一位,去掉已经处理过的最低位。
E.最后,返回反转后的整数result。
(4)代码实现
class Solution:
# @param n, an integer
# @return an integer
def reverseBits(self, n):
result = 0
for _ in range(32):
result = (result << 1) | (n & 1)
n >>= 1
return result
位1的个数
(1)题目描述
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
(2)输入输出示例
示例 1:
输入:n = 00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:
输入:n = 00000000000000000000000010000000输出:1解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:
输入:n = 11111111111111111111111111111101输出:31解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
(3)解题思路
A.使用for循环遍历从0到31的整数i。
B.在循环中,将n右移i位,然后与1进行按位与运算,判断结果是否为1。
C.如果结果为1,则说明n的第i位是1,将计数器count加1。
D.循环结束后,返回计数器count的值,即为n的二进制表示中1的个数。
(4)代码实现
class Solution(object):
def hammingWeight(self, n):
count = 0
for i in range(32):
if (n >> i) & 1:
count += 1
return count
"""
:type n: int
:rtype: int
"""