从位运算看海象运算符

2024-06-15 22:44
文章标签 运算 运算符 海象 从位

本文主要是介绍从位运算看海象运算符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 需求
  • 先找出需要多少位数
  • 使用限制
    • 赋值场景
    • 判断场景
  • 转为one-hot编码
  • 一件小事情

前言

突然发现了Python3.8版本引入的海象运算符,就借着位运算的需求来看看是怎么个用法。

需求

需求是这样的,我有一张表,表中存在很多类东西,每个类都有一个自增编号。为了让自增编号转变为one-hot编码,需要将自增的编号转换为二进制。

当然,确实是可以直接使用Python的二进制转换工具,但那样就完全没意思了不是吗?

先找出需要多少位数

首先,我们需要知道,自增编号的最大值是多少。

既然是表里面存储的,那么这一点就比较好办:

SELECT MAX(id) FROM table_name;

不管你用jdbc也好,ODBC也罢,反正你拿到了这个最大值。于是你开始准备着手计算:

def get_max_length(max_id):count = 1while max_id := max_id >> 1:count += 1return count

这就是海象运算符的用法。在判断的时候,先计算海象运算符右侧,然后把结果赋值给左侧,最后判断左值是否满足条件。

使用限制

当然,这并不是Go语言,所以海象运算符并不是哪里都能用。

赋值场景

在赋值过程中,如果搭配括号,那么海象运算符与赋值符号是完全一致的。

a = (a - 30) / 2

这个看着相当简单。而如果我说可以用海象运算符装个莫名其妙的逼呢?

a = (a := (a := a - 30) / 2)

看起来很诡异,但是原理上与传统的赋值符号用法完全一致。毕竟二者都是一个顺序:

先计算右值、再赋给左值。

当然,二者也不是完全不同。海象运算符不可以直接赋值

传统赋值过程中,如果我们是可以直接指定的:

a = 30

海象运算符不一样,会报错:

a := 30
~~^^~~~

这就是为什么,我们在装逼的时候,最左边的赋值还只能是=符号。

判断场景

海象运算符最大的特点就是,本身返回的是值,所以判断场景才是海象运算符最常用的场景。就比如说,我需要移位,传统过程只能这么做:

a = a >> 1
if a > 0:print(a)

因为=没有返回值,只能将右值给到左值。

海象运算符不一样,在将右值给到左值的基础上,还能够把左值返回出去:

if a := a >> 1:print(a)

不过需要注意的是,海象运算符的优先级比较低,在真实场景使用的时候需要带上括号:

if a := 30 > 40:print(a) # 不输出
print(a)   # 输出False,因为优先级算了30 > 40

转为one-hot编码

当然,由于是one-hot编码,我们并不能直接使用二进制数值,因为这样做无法转为矩阵。

不过好在,我们还有海象运算符,我们可以这么做:

def transfer2b(num):# 先把最初的一位数加进去onehot = [num & 1]# 海象运算符循环处理while num := num >> 1:# 使用切片的方式增加数据onehot[:0] = [num & 1]# 由于并非极端场景,所以与`insert`差距不大# 下面是`insert`写法:# onehot.insert(0, num & 1)return onehot

那么我们在使用的时候就会很方便:

print(transfer2b(64)) # 输出:[1, 0, 0, 0, 0, 0, 0]

一件小事情

最开始的时候,我始终认为 64 64 64是只需要 6 6 6位二进制,后来才想起来,用二进制表示的时候还有一个 0 0 0需要表示。

所以,如果是 64 64 64,其实需要 7 7 7位,因为 6 6 6位只能够表示 0 ∼ 2 6 − 1 0\sim2^6-1 0261。数字虽然确实是有 64 64 64个,但由于从 0 0 0开始,所以实际最大也就少了一个。

这篇关于从位运算看海象运算符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064786

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

【重学 MySQL】十九、位运算符的使用

【重学 MySQL】十九、位运算符的使用 示例检查权限添加权限移除权限 在 MySQL 中,位运算符允许你直接在整数类型的列或表达式上进行位级操作。这些操作对于处理那些需要在二进制表示上进行直接修改或比较的场景特别有用,比如权限管理、状态标记等。 &(位与) 对两个数的二进制表示进行位与操作。只有两个相应的二进制位都为 1 时,结果的该位才为 1,否则为 0。 |(位

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

第二十四章 rust中的运算符重载

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust中的运算符重载 目录 注意一、前言二、基本使用三、常用运算符四、通用约束 一、前言 C/C++中有运算符重载这一概念,它的目的是让即使含不相干的内容也能通过我们自定义的方法进行运算符操作运算。 比如字符串本身是不能相加的,但由于C++中的String重载了运算符+,所以我们就可以将两个字符串进行相加、但实际

【Java中的位运算和逻辑运算详解及其区别】

Java中的位运算和逻辑运算详解及其区别 在 Java 编程中,位运算和逻辑运算是常见的两种操作类型。位运算用于操作整数的二进制位,而逻辑运算则是处理布尔值 (boolean) 的运算。本文将详细讲解这两种运算及其主要区别,并给出相应示例。 应用场景了解 位运算和逻辑运算的设计初衷源自计算机底层硬件和逻辑运算的需求,它们分别针对不同的处理对象和场景。以下是它们设计的初始目的简介:

位运算:带带孩子吧,孩子很强的!

快速进制 在聊到位运算之前,不妨先简单过一遍二进制的东西。熟悉二进制和十进制的快速转换确实是掌握位运算的基础,因为位运算直接在二进制位上进行操作。如果不熟悉二进制表示,很难直观理解位运算的效果。 这里主要涉及二进制和十进制之间的互相转换。 十进制转二进制 十进制转二进制可以使用常见的 除2取余法 进行。每次将十进制除以2并记录所得余数,直到商为0,然后再将记录的余数 从下往上排列即

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

Java基础--基本运算符介绍

Java运算符 用于指明对于操作数的运算方式。 分类: 按照操作数的数目来进行分类: 单目a++ 双目a+b 三目(a>b)?x:y; 按照运算符的功能来进行分类: 算术运算:+ - * / %(取余)++ – 如: int x=1; x=x+1;//x空间内的值,自己增加了一个 x++;//x空间内的值,自增一个 ++x;//对于x空间内的值来讲都是一致,最终的结果都自

快速幂运算的一些模板

这里用递归和循环两种做法来做。 简单来说,快速幂就是把底数扩大,指数缩小,比如2*2=4;计算2的幂时,就可以转换成4的幂来运算,这样可以避免在计算大的数据时爆int的现象  //递归int power(int a,int n){int ans;if(n==2) ans=1;else{ans=power(a*a,n/2);if(n%2==1) ans*=a;}return ans;}