从位运算看海象运算符

文章目录

  • 前言
  • 需求
  • 先找出需要多少位数
  • 使用限制
    • 赋值场景
    • 判断场景
  • 转为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.mzph.cn/pingmian/28316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

canvas学习

Canvas API 提供了一个通过 JavaScript 和 HTML 的 元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。 Canvas 的基本用法 <canvas> 元素 <canvas id"tutorial" width"150" height"150&quo…

3.1. 马氏链-马氏链的定义和示例

马氏链的定义和示例 马氏链的定义和示例1. 马氏链的定义2. 马氏链的示例2.1. 随机游走2.2. 分支过程2.3. Ehrenfest chain2.4. 遗传模型2.5. M/G/1 队列马氏链的定义和示例 1. 马氏链的定义 对于可数状态空间的马氏链, 马氏性指的是给定当前状态, 其他过去的状态与未来的预测…

DM存储ontap系统修改管理IP

存储已配置完成在使用&#xff0c;修改管理ip不会影响生产 旧管理IP新管理IP192.0.2.1/24192.0.10.1/24192.0.2.2/24192.0.10.2/24192.0.2.3/24192.0.10.3/24 旧网关&#xff1a;192.0.2.254 新网关&#xff1a;192.0.10.254 查看现有的管理IP信息 cluster1::> network …

[Python]Anaconda相关命令

环境操作相关命令 查看所有环境 conda env list创建环境 conda create --name cahttts python3.10激活环境 conda activate cahttts安装依赖文件 pip install -r requirements.txt查看GPU型号 nvidia-smi -LGPU 0: NVIDIA A10 (UUID: GPU-9f1fc9cf-582a-25ac-849c-2f77343…

TS-语法介绍

1. 基本语法 变量声明 TypeScript 中的变量声明方式有 let、const 和 var&#xff0c;推荐使用 let 和 const。 let isDone: boolean false; const PI: number 3.14;函数 函数声明与 JavaScript 类似&#xff0c;但可以指定参数和返回值类型。 function add(x: number, …

ESD与EOS区别

最近小白在做项目时&#xff0c;被一个实习生问道了&#xff0c;关于EOS与ESD区别。说实话&#xff0c;以前专注于测试debug的我&#xff0c;在回答对方时&#xff0c;并没法做到太全面的解答。于是乎&#xff0c;借助周内的空闲时间&#xff0c;小白还是简单学习总结了一番。 …

洛谷 AT_arc168_a [ARC168A] <Inversion> 题解

逆序对 在一个没有重复数值的序列 a a a 之中&#xff0c;如果存在一组下标 i i i 和 j j j 使得 i < j i<j i<j&#xff0c;那么当 a i > a j a_i>a_j ai​>aj​ 时&#xff0c;就称 a i a_i ai​ 和 a j a_j aj​ 是序列 a a a 中的一组逆序对。 …

Harbor镜像中心搭建

文章目录 Harbor镜像中心搭建前置条件下载Harbor创建CA证书配置Harbor开始启动地址映射访问配置本地登录配置外部虚拟机访问 Harbor镜像中心搭建 Harbor是一个镜像中心&#xff0c;我们所熟知的DockerHub就是一个镜像中心&#xff0c;我们可以把我们打包的镜像放在镜像中心中供…

JavaFX应用

JavaFX案例&#xff1a;集成进度条与后台任务 在这个示例中&#xff0c;我们将向JavaFX应用中集成一个进度条&#xff0c;用来展示一个模拟的后台任务的完成进度。这将涉及JavaFX的并发特性&#xff0c;特别是Task类和如何在UI线程安全地更新UI组件。 假设我们想要实现一个简…

关于Java

关于Java Java语言关于并发JVM调优工具写在最后 Java语言 Java语言作为当下主流开发语言&#xff0c;其面向对象的开发模式以及一次编译多次运行&#xff0c;跨平台运行以及自动的垃圾回收机制可以说是给开发者节省了很大的时间用于逻辑功能的开发&#xff0c;那么在开发过程中…

【Linux】pycharmgit相关操作

目录 1. git安装配置2. 相关内容3. pycharm连接远程仓库3.1 配置3.2 clone远程仓库3.3 本地仓库上传远程 4. 分支管理4.1 更新代码4.2 新建分支4.3 分支合并4.4 代码比对 5. 版本管理6. 命令行操作6.1 配置git6.2 基础操作6.3 分支操作 1. git安装配置 下载链接&#xff1a;官…

07--Zabbix监控告警

前言&#xff1a;和普米一样运维必会的技能&#xff0c;这里总结一下&#xff0c;适用范围非常广泛&#xff0c;有图形化界面&#xff0c;能帮助运维极快确定问题所在&#xff0c;这里记录下概念和基础操作。 1、zabbix简介 Zabbix是一个基于 Web 界面的企业级开源解决方案&a…

【C++】C++入门的杂碎知识点

思维导图大纲&#xff1a; namespac命名空间 什么是namespace命名空间namespace命名空间有什么用 什么是命名空间 namespace命名空间是一种域&#xff0c;它可以将内部的成员隔绝起来。举个例子&#xff0c;我们都知道有全局变量和局部变量&#xff0c;全局变量存在于全局域…

路由组件和非路由组件区别:

1、总结 路由组件和非路由组件区别&#xff1a; 非路由组件放在components中&#xff0c;路由组件放在pages或views中非路由组件通过标签使用&#xff0c;路由组件通过路由使用在main.js注册玩路由&#xff0c;所有的路由和非路由组件身上都会拥有$router $route属性$router&a…

SQLAlchemy:filter()和filter_by()的微妙差异

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 在Python编程中&#xff0c;SQLAlchemy是一个强大的ORM&#xff08;对象关系映射&#xff09;工具&#xff0c;它允许使用Python代码来操作数据库。然而&#xff0c;对于新手来说&#xff0c;SQLAlchemy中的一些函数…

Web前端开发PPT:深入探索与实战应用

Web前端开发PPT&#xff1a;深入探索与实战应用 在数字化时代&#xff0c;Web前端开发已成为构建丰富、交互性强的网页应用的关键环节。本次分享旨在通过PPT的形式&#xff0c;带领大家深入探索Web前端开发的精髓&#xff0c;并分享一些实战应用的经验。接下来&#xff0c;我们…

mybatis-plus使用拦截器实现sql完整打印

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 在使用mybatis-plus&#xff08;mybatis&#xff09;的时候&#xff0c;往往需要…

【C语言】多进程创建和回收

多进程创建和回收 一、多进程创建和回收1. fork()2. wait()3. waitpid() 最后 一、多进程创建和回收 孤儿进程&#xff1a;父进程先退出了&#xff0c;子进程没有退出&#xff0c;成为孤儿进程&#xff0c;父进程变成1号进程。僵尸进程&#xff1a;父进程没有退出&#xff0c;…

英伟达开源最强通用模型Nemotron-4 340B:开启AI合成数据新纪元

【震撼发布】 英伟达最新力作——Nemotron-4 340B,一个拥有3400亿参数的超级通用模型,震撼登场!这不仅是技术的一大飞跃,更是AI领域的一次革命性突破! 【性能卓越】 Nemotron-4 340B以其卓越的性能超越了Llama-3,专为合成数据而生。它将为医疗健康、金融、制造、零售等行…

Studio One 6.6.2 for Mac怎么激活,有Studio One 6激活码吗?

如果您是一名音乐制作人&#xff0c;您是否曾经为了寻找一个合适的音频工作站而苦恼过&#xff1f;Studio One 6 for Mac是一款非常适合您的MacBook的音频工作站。它可以帮助您轻松地录制、编辑、混音和发布您的音乐作品。 Studio One 6.6.2 for Mac具有直观的界面和强大的功能…