datawhale学习笔记(Leetcode基础算法202312):task05位运算

位运算

位运算与二进制

        位运算(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

        """
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值