我与二进制的微妙关系

Hello world!很久没写博客了。家庭与生活,工作与力扣,难舍难分,总之一言难尽。今天写一下我对二进制的一知半解,分享给各位,共勉!

一、介绍二进制

说起二进制,我们不得不从 0 开始。假设现在让我们数数,一般我们数到 9 的下一个数就会进十,变成 10。而二进制,就是数到 2 变成 10。任何进制包括  8 或 16 进制的进制原理都和这个类似。

我们用计算机存储的数据,都会使用二进制进行存储,也就是 n 个 0 与 n 个 1 进行组合。主要因为二进制的数制系统相较于其他进制只有 0 和 1 两个标识,简单且方便计算机识别与处理。

二、二进制的运算符

下面简单介绍这些运算符。

按位与(And)( & )

按位与的运算原理,若把 1 看作 true 的话与逻辑运算符 && 很像。当两个数的二进制同位都为 1 时,运算为 1,否则为 0。

(1 & 1) = (01 & 01) = 01

(1 & 0) = (01 & 00) = 00

(2 & 1) = (10 & 01) = 00

按位或(Or)( | ) 

按位或与逻辑运算的 || 很像。当两个数的二进制同位只要存在1个或2个 1 时,运算都为 1,否则为 0。

(1 | 1) = (01 | 01) = 01

(1 | 0) = (01 | 00) = 01

(2 | 1) = (10 | 01) = 11

按位异或(Xor)( ^ ) 

按位异或就是当两个数的二进制同位进行差值取绝对值。

(1 ^ 1) = (01 ^ 01) = 00

(1 ^ 0) = (01 ^ 00) = 01

(2 ^ 1) = (10 ^ 01) = 11

取反( ~ ) 

取反,顾名思义,就是将二进制每位上的 0 变为 1,1 变为 0。

(~2) = (~10) = 11111111111111111111111111111101

(~3) = (~11) = 11111111111111111111111111111100

左移( << ) 

左移,顾名思义,就是将二进制中右侧的第一个 1 到左侧的部分向左移动几个单元,也可以说是在二进制后补几个 0

(1 << 1) = (01 << 1) = 10

(9 << 3) = (1001 << 3) = 1001000

(2 << 3) = (10 << 3) = 10000

右移( >> ) 

右移,与左移相反,右移若没有位数可以移动,就是 0

(1 >> 1) = (01 >> 1) = 00

(9 >> 3) = (1001 >> 3) = 01

(2 >> 3) = (10 >> 3) = 00

 三、二进制的实际应用

为了更充分的利用刚刚学到的二进制运算符原理,下面我们直接进入今天的主题,用二进制都能干啥?

二进制如果利用得当,可以很大程度的提高程序的运行效率。

1、字符串系列

  • 字符串与数字进行转换。

对于阿斯克码值中,数字范围与种类相对较小的就是英文的大小写字符。大小写分别为 26 种,也就是 A ~ Z 与 a ~ z。那么对于一个字符串来说,如果纪录这串字符中都使用了哪些字母,我们可以使用二进制来解决。

字符串:abcdefg - 0123456 - 1111111 - 127

解释:对于小写字符,a 可以看为 0,z 可以看作 25,最高不超过 int 类型的二进制最大位的31位。因此,这里不考虑原字符串的字母排列顺序以及每个字母的使用频次,那么使用 int 来存储所有使用过的字符完全足够。也就是说,127 这个数字告诉我们,它的二进制 0 到 6 位都是 1,那么通过阿斯克码转换,可以知道这个字符串使用了 a ~ g 这 7 个字符

代码:

    public int charToNum(String str) {
        int mask = 0;
        for (int c : str.toCharArray()) {
            mask |= (1 << c - 'a');
        }
        return mask;
    }

 

  • 两个字符串比较是否存在使用了相同的字符

基于前面的字符串转数字的技巧,我们可以更进一步的使用这种方式,来比较两个英文字符串是否存在相同字符。

字符串:hello vs world

              hello -  00000000100100010010000 - 18576

              world - 10000100100100000001000 - 4343816

解释:直观可以看到有 2 处的 1 处在同位,意味着存在 2 种冲突的字符

代码:

    public boolean conflict(String s1, String s2) {
        int a = charToNum(s1), b = charToNum(s2);
        return (a & b) != 0;
    }

 这里我们使用按位与(&)可以巧妙的解决两个数字的相同二进制位是否存在都为 1 的情况。

  • 求得两个字符中存在几种冲突的字符

知道了是否冲突,如果更进一步需要知道存在几种冲突,我们可以考虑枚举二进制串中存在几个 1 即可。这里需要思考:使用哪些二进制运算符,以及如果一次性无法计算出某些结果,我们该如何组合使用二进制运算符,并设计一个程序来帮我们求得结果。单个二进制运算符的运算能力有限,因此当我们对二进制运算符掌握的足够牢靠,以及有相当够的经验,很多新的问题也可以尝试去使用二进制运算符解决。就好比当我们只知道加法时,对于 6 个 6 相加,我们需要一个一个的累加求得结果,而不是 6 乘以 6。

代码:

    public int countConflicts(String s1, String s2) {
        int binary = charToNum(s1) & charToNum(s2);
        int mask = 1, cnt = 0;
        // 31 是二进制 int 最大长度
        for (int i = 0; i < 31; ++i) {
            if ((binary & mask) != 0) { ++cnt; }
            mask <<= 1;
        }
        return cnt;
    }
  • 字符串与二进制的一些思考 

当然,int 类型的二进制位最大支持 31 位,更大的可以选择 long 类型的 63 位了。对于字符串转数字,只要计算的维度的取值范围不超过 63,我们都可以采取二进制的方式去进行程序设计。汉字不像英文字符仅有 26 个,但汉字的拼音确是由 26 个英文字母组成,如果你想象力足够丰富,是可以设计出意想不到的程序的。

2、待定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/163507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【RocketMq系列-01】RocketMq安装和基本概念

RocketMq系列整体栏目 内容链接地址【一】RocketMq安装和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709 RocketMq安装和基本概念 一&#xff0c;RocketMq安装和基本概念1&#xff0c;RocketMq基本安装(本地安装)2&#xff0c;Rocketmq的核心概念2.1&…

Linux使用ifconifg命令,没有显示ens33

Linux使用ifconifg命令&#xff0c;没有显示ens33 1.问题2.步骤2.1 查看虚拟机的组件是否启动了2.2 修改网络配置文件 ONBOOT修改为yes2.3 重启网络2.4 修改网络服务配置 3.解决 1.问题 打开虚拟机准备使用xshell连接时发现连接失败&#xff0c;在机器上查看ip发现ens33不现实…

Mysql主从搭建

Mysql主从搭建 1.Mysql下载1.1 查看操作系统2.2 下载mysql安装包 2.Mysql安装2.1 解压2.2 目录重命名2.3 创建data&#xff0c;存储文件2.4 创建用户组2.5 授权用户2.6 配置环境变量2.7 编辑my.cnf2.8 创建相关目录和文件2.9 初始化数据库2.10 复制mysql.server到/etc/init.d/下…

安卓环境搭建及运行安卓应用

1 jdk安装 安卓项目也是java开发的&#xff0c;运行在虚拟器上&#xff0c;安装jdk及运行的时候&#xff0c;就会带上虚拟器 jdk前面已经讲过&#xff0c;不在讲解 2 下载安装androj studio https://developer.android.google.cn/studio?hlzh-cn 下载下来&#xff0c;双击…

Shell脚本:Linux Shell脚本学习指南(第一部分Shell基础)一

你好&#xff0c;欢迎来到「Linux Shell脚本」学习专题&#xff0c;你将享受到免费的 Shell 编程资料&#xff0c;以及很棒的浏览体验。 这套 Shell 脚本学习指南针对初学者编写&#xff0c;它通俗易懂&#xff0c;深入浅出&#xff0c;不仅讲解了基本知识&#xff0c;还深入底…

数据采集与大数据架构分享

实现场景 要实现亿级数据的长期收集更新&#xff0c;并对采集后的数据进行整理和加工&#xff0c;用于人工智能的训练数据素材集。 数据采集 java支持的爬虫框架还是有很多的&#xff0c;如&#xff1a;webMagic、Spider、Jsoup等添加链接描述 pipeline处理管道 数据并发开发…

供应链|顶刊MSOM论文解读:服务竞争下的库存共享

问题背景 在汽车、玩具等行业中&#xff0c;零售商之间的库存共享变得十分常见。库存共享可以解决由需求不确定导致的库存错配问题。如果零售商之间同意共享库存&#xff0c;那么当需求较少、自身库存过剩时&#xff0c;可以将过剩库存卖给其他零售商&#xff1b;反之&#xf…

WinForms C# 导入和导出 CSV 文件 Spread.NET

使用 WinForms C# 和 VB.NET 导入和导出 CSV 文件 2023 年 11 月 17 日 使用 Spread.NET 直接在 .NET WinForms 应用程序中处理 CSV 文件。 Spread.NET可帮助您创建电子表格、网格、仪表板和表单。它包括一个强大的计算引擎&#xff0c;具有 450 多个函数以及导入和导出 Micros…

iptables详解:链、表、表链关系、规则的基本使用

目录 防火墙基本概念 什么是防火墙&#xff1f; Netfilter与iptables的关系 链的概念 表的概念 表链关系 规则的概念 查询规则 添加规则 删除iptables中的记录 修改规则 更详细的命令&#xff08;5链4表&#xff09; 防火墙基本概念 什么是防火墙&#xff1f; 在…

在VS Code中使用VIM

文章目录 安装和基本使用设置 安装和基本使用 VIM是VS Code的强大对手&#xff0c;其简化版本VI是Linux内置的文本编辑器&#xff0c;堪称VS Code问世之前最流行的编辑器&#xff0c;也是VS Code问世之后&#xff0c;我仍在使用的编辑器。 对VIM无法割舍的原因有二&#xff0…

Python中,我们可以使用pandas和numpy库对Excel数据进行预处理,包括读取数据、数据清洗、异常值剔除等

文章目录 一、什么是数据预处理二、对excel数据进行详细的数据预处理操作总结 一、什么是数据预处理 数据预处理是一种对数据进行清洗、整理、转换等操作的过程&#xff0c;旨在提高数据质量&#xff0c;使其适应模型的需求&#xff0c;从而改进数据挖掘或机器学习的结果。 数…

【LLM】基于LLM的agent应用(更新中)

note 在未来&#xff0c;Agent 还会具备更多的可扩展的空间。 就 Observation 而言&#xff0c;Agent 可以从通过文本输入来观察来理解世界到听觉和视觉的集成&#xff1b;就 Action 而言&#xff0c;Agent 在具身智能的应用场景下&#xff0c;对各种器械进行驱动和操作。 Age…

从0开始学习JavaScript--JavaScript 字符串与文本内容使用

JavaScript中的字符串和文本内容处理是前端开发中的核心技能之一。本文将深入研究字符串的创建、操作&#xff0c;以及文本内容的获取、修改等操作&#xff0c;并通过丰富的示例代码&#xff0c;帮助读者更全面地了解和应用这些概念。 JavaScript 字符串基础 字符串是JavaScr…

Nacos注册表解读

基本介绍 在 Nacos 中&#xff0c;注册表是其中一个重要的组件&#xff0c;用于管理服务的注册和发现。 注册表是一个存储服务实例信息的数据库&#xff0c;它记录了所有已注册的服务实例的相关信息&#xff0c;包括服务名称、IP 地址、端口号等。 通过注册表&#xff0c;服…

定时获取公网ip并发送邮件提醒

前一段时间路由器刷的老毛子固件“穿透服务”中定时更新阿里DDNS失败了&#xff0c;用了很久第一次遇到。所以需要做个备用的措施用来实时获取公网ip信息 1、基于python实现 开启邮箱的SMTP功能拿到授权码(不是登录密码) #!/usr/bin/python # -*- coding: UTF-8 -*- import …

2023年中职“网络安全“—Web 渗透测试①

2023年中职"网络安全"—Web 渗透测试① Web 渗透测试任务环境说明&#xff1a;1.访问地址http://靶机IP/task1&#xff0c;分析页面内容&#xff0c;获取flag值&#xff0c;Flag格式为flag{xxx}&#xff1b;2.访问地址http://靶机IP/task2&#xff0c;访问登录页面。…

判断序列值是否单调递增 PandasSeries中的方法:is_monotonic_increasing

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断序列值是否单调递增 PandasSeries中的方法&#xff1a; is_monotonic_increasing 选择题 请问下列程序运行的的结果是&#xff1a; import pandas as pd s1 pd.Series([1, 2, 5]) prin…

机器学习赋予用户“超人”的能力来打开和控制虚拟现实中的工具

原创 | 文 BFT机器人 最近&#xff0c;剑桥的研究人员开发了一种虚拟现实应用程序&#xff0c;只需用户手部的移动即可打开和控制一系列3D建模工具。 来自剑桥大学的研究人员利用机器学习开发了“HotGestures”类似于许多桌面应用程序中使用的热键&#xff08;快捷键&#xff…

Python (十二) 模块、包

模块 模块是以 .py后缀的文件&#xff0c;包含所有定义的函数和变量的文件。 模块可以被别的程序引入&#xff0c;以使用该模块中的函数等功能&#xff0c;如python 标准库、第三方模块等。 导入模块用关键词-import,from ...import 引入python标准库math模块 import math #调用…

Portraiture2024PS/LR专用智能磨皮插件,AI算法美颜,提高P图效率

ps皮肤美白磨皮滤镜有吗&#xff1f;ps本身无自带美白磨皮滤镜&#xff0c;虽然部分滤镜有磨皮、提亮功能&#xff0c;但往往需要搭配蒙版、通道功能使用。但ps可安装第三方软件&#xff0c;比如常用的磨皮插件portraiture3&#xff0c;那么&#xff0c;磨皮插件portraiture3怎…
最新文章