iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >关于Python 位运算防坑指南
  • 923
分享到

关于Python 位运算防坑指南

2024-04-02 19:04:59 923人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、背景2、C# 语言3、python 语言4、技术分析1、背景 我们先看这个题目: 标题:137. 只出现一次的数字 II 难度:中等 https://LeetCode-cn

1、背景

我们先看这个题目:

标题:137. 只出现一次的数字 II
难度:中等
https://LeetCode-cn.com/problems/single-number-ii/

给定一个 非空 整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:


输入: [2,2,3,2]
输出: 3

示例 2:


输入: [0,1,0,1,0,1,99]
输出: 99

思路:

初始result = 0,将每个数想象成 32 位的二进制,对于每一位的二进制的1累加起来必然是3N或者3N + 1(出现3次和1次);3N代表目标值在这一位没贡献,3N + 1代表目标值在这一位有贡献(=1),然后将所有有贡献的位记录到result中。这样做的好处是如果题目改成k个一样,只需要把代码改成count % k即可,很通用并列去找每一位。

2、C# 语言

  • 执行结果:通过
  • 执行用时:112 ms, 在所有 C# 提交中击败了 91.53% 的用户
  • 内存消耗:25.2 MB, 在所有 C# 提交中击败了 100.00% 的用户

public class Solution
{
    public int SingleNumber(int[] nums)
    {
        int result = 0;
        for (int i = 0; i < 32; i++)
        {
            int mask = 1 << i;
            int count = 0;
            for (int j = 0; j < nums.Length; j++)
            {
                if ((nums[j] & mask) != 0)
                { 
                    count++;
                }
            }
            if (count % 3 != 0)
            {
                result |= mask;
            }
        }
        return result;
    }
}

3、Python 语言


class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        result = 0
        for i in range(32):
            mask = 1 << i
            count = 0
            for num in nums:
                if num & mask != 0:
                    count += 1
            if count % 3 != 0:
                result |= mask
        return result

以上 Python 代码与 C# 代码逻辑完全一致,但提交时报错。错误信息如下:


输入:[-2,-2,1,1,-3,1,-3,-3,-4,-2]
输出:4294967292
预期结果:-4

我们发现:

-4 补码为 1111 1111 1111 1111 1111 1111 1111 1100

如果不考虑符号位

1111 1111 1111 1111 1111 1111 1111 1100 -> 4294967292

是不是很坑,c++,C#,Java等语言的整型是限制长度的,如:byte 8位,int 32位,long 64位,但 Python 的整型是不限制长度的(即不存在高位溢出),所以,当输出是负数的时候,会导致认为是正数!因为它把32位有符号整型认为成了无符号整型,真是坑。

我们对以上的代码进行修改,加入判断条件 if result > 2 ** 31-1: 超过32位整型的范围就表示负数了result -= 2 ** 32,即可得到对应的负数。

  • 执行结果:通过
  • 执行用时:96 ms, 在所有 python3 提交中击败了 19.00% 的用户
  • 内存消耗:14.8 MB, 在所有 Python3 提交中击败了 25.00% 的用户

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        result = 0
        for i in range(32):
            mask = 1 << i
            count = 0
            for num in nums:
                if num & mask != 0:
                    count += 1
            if count % 3 != 0:
                result |= mask
            if result > 2 ** 31-1:
                result -= 2 ** 32
        return result

4、技术分析

上面的问题解决了,我们在深入的探讨一下。

整数在内存中是以补码的形式存在的,输出自然也是按照补码输出。


class Program
{
    static void Main(string[] args)
    {
        string s1 = Convert.ToString(-3, 2);
        Console.WriteLine(s1); 
        // 11111111111111111111111111111101
        
        string s2 = Convert.ToString(-3, 16);
        Console.WriteLine(s2); 
        // fffffffd
    }
}

但我们看一下 Python bin() 输出。


print(bin(3))  # 0b11
print(bin(-3))  # -0b11

print(bin(-3 & 0xffffffff))  
# 0b11111111111111111111111111111101

print(bin(0xfffffffd))       
# 0b11111111111111111111111111111101

print(0xfffffffd)  # 4294967293

是不是很颠覆认知,我们从结果可以看出:

  • Python中bin一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,巨坑。
  • Python中的整型是补码形式存储的。
  • Python中整型是不限制长度的不会超范围溢出。

所以为了获得负数(十进制表示)的补码,需要手动将其和十六进制数0xffffffff进行按位与操作,再交给bin()进行输出,得到的才是负数的补码表示。

总结:
这篇图文从一道Leetcode题目开始说起,发现C#语言与Python语言在利用二进制处理整型数据时存在不同,Python语言不属于强类型语言所以不限制整型的位数,表面上看好像方便使用其实就是个坑。大家使用时多加小心。

到此这篇关于关于Python 位运算防坑指南的文章就介绍到这了,更多相关Python 位运算防坑指南内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 关于Python 位运算防坑指南

本文链接: https://www.lsjlt.com/news/135966.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 关于Python 位运算防坑指南
    目录1、背景2、C# 语言3、Python 语言4、技术分析1、背景 我们先看这个题目: 标题:137. 只出现一次的数字 II 难度:中等 https://leetcode-cn...
    99+
    2024-04-02
  • Python运算符完全指南
    Python是一种简单易学的编程语言,它提供了丰富的运算符,用于进行各种数学和逻辑操作。本文将介绍Python中常用的运算符,并提供具体的代码示例。 算术运算符算术运算符用于执行基本的数学运算,包括加、减、乘、除、取余和幂运算。...
    99+
    2024-01-20
  • 关于Ant-Design-Vue快速上手指南+排坑
    目录前言NO.1 表单组件如何自定义表单校验规则表单回显提交表单NO.2 表格(Table)NO.3 Spin组件打包优化结语前言 公司要开发一个后台管理系统,对于UI库的选择上选择...
    99+
    2024-04-02
  • 关于远程调用RestTemplate的使用避坑指南
    目录一、前言介绍二、 问题记录1. 慎!【url参数中有json字符串】2. 慎!【url参数中有经过URLEncode的字符串】3. 慎!【url参数中存在特殊字符】 --- 针对...
    99+
    2024-04-02
  • 5 Python 关于除法运算
    1  不够除怎么办2 关于浮点运算编译器有智能推导(或者说识别)功能3  负数的除法4 什么是截断除法和精确除法     Python里面的除法分精确除法和截断除法;截断表示截断小数分,取整数部分的意思。实际应用中,精确除法比截断除法更频繁...
    99+
    2023-01-31
    除法 Python
  • 关于实现Vue3版抖音滑动插件踩坑指南
    目录起步调研实现思路工程构建代码实现video实现slide.vue组合使用视频自动播放问题git地址总结起步 年前单位需要搞一个类似抖音的需求,这本应是客户端的任务,然而,不知天高...
    99+
    2024-04-02
  • 关于python的矩阵乘法运算
    目录一、矩阵乘法1. A@B 和 np.dot(A,B)2. A*B 或 np.multiply(A,B)二、邻接矩阵的相乘的意义1.定义2.问题3.理解4.代码实现一、矩阵乘法 矩...
    99+
    2023-05-17
    python运算 python 矩阵乘法
  • 学会熟练运用Python各类运算符:全面指南
    Python运算符完全指南:学会正确运用各类运算符导语:在Python中,运算符是用于执行各种数学或逻辑操作的特殊符号。熟练掌握各类运算符可以帮助我们更高效地编写代码。本文将系统地介绍Python的各类运算符,并为每种运算符提供具体的代码示...
    99+
    2023-12-30
    Python 学习 运算符
  • 基于Taichi的Python高性能计算入门指南
    自从Python编程语言诞生以来,它的核心理念一直是最大限度地提高代码的可读性和简单性。Python对可读性和简单性的追求简直达到了如痴如狂的境地。一个事实即可证实这一点:只要你在Python系统的根目录中输入命令“import this”...
    99+
    2023-05-14
    Python 编程语言 Taichi
  • Python运算符:从菜鸟到大师的终极指南
    Python运算符简介 运算符是特殊符号或关键字,用于执行两种或多种操作数之间的操作。Python提供了多种运算符,涵盖广泛的用途,从基本的数学运算到复杂的数据操作。 数学运算符 数学运算符用于执行常见的数学运算。它们包括: 运算...
    99+
    2024-03-09
    Python、运算符、数学运算符、逻辑运算符、比较运算符、赋值运算符
  • 学会使用不同类型的Python运算符:全面指南
    Python运算符号指南:掌握各类运算符的用法,需要具体代码示例在Python编程中,运算符是一种用于执行各种数学和逻辑运算的特殊符号。掌握运算符的使用可以帮助程序员更有效地处理数据并实现代码功能。本文将介绍常见的Python运算符类型,并...
    99+
    2023-12-30
    Python 指南 运算符
  • 关于Python中的海象运算符使用方法详解
    海象运算符(walrus operator)是 Python 3.8 中引入的一种新的语法,其使用方法如下: variable := expression 其中,expression...
    99+
    2023-05-16
    Python运算符 Python海象运算符
  • Python 的运算符和语句(条件、循环、异常)基本使用指南
    运算符的分类 算数运算符赋值运算符复合赋值运算符比较运算符逻辑运算符 算数运算符 运算符描述实例+加1 + 1 输出结果为 2-减1 - 1 输出结果为 0*乘2 * 2 输出结果为 4/除10 /...
    99+
    2023-09-21
    python 开发语言
  • Python 实时数据处理的终极指南:如何运用 bash 和关键字进行优化?
    实时数据处理是现代数据科学中最重要的领域之一。Python 作为最受欢迎的数据科学编程语言之一,为处理实时数据提供了强大的工具。但是,Python 的速度可能受到限制,特别是在需要处理大量数据的情况下。在本文中,我们将介绍如何使用 bas...
    99+
    2023-11-14
    实时 关键字 bash
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作