算法通关村第十一关——搞清位运算

源码、反码和补码

很多人都记不清源码、反码和补码的区分,都是二进制,其实记忆起来很简单,分为正数和负数来记。正数的原码、反码和补码都是一样的,负数的原码符号位为1,反码是在原码的基础上进行改变:保持符号位不变,其他位取反;补码是在反码的基础上:反码的末位加1。如下图所示:

在这里插入图片描述

位运算规则

与:&。运算规则:对于每个二进制位,都为1,结果才为1,否则为0。

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

或:|。运算规则:对于每个二进制位,只要有一个为1,结果就为1。

00 = 0
01 = 1
10 = 1
11 = 1

异或:,代码中用^表示。运算规则:对于每个二进制位,相同为0,不相同为1。

00 = 0
01 = 1
10 = 1
11 = 0

取反:~,运算规则:对于每个二进制位进行取反操作,1变为0,0变为1。

~1 = 0
~0 = 1

移位运算与乘除法

左移运算:<<,将全部二进制位左移若干位,高位丢弃,低位补0。对于左移运算,算术移位和逻辑移位是相同的。

右移运算:>>,将全部二进制位向右移动若干位,低位丢弃,高位的补位由算术移位或逻辑移位决定:

  • 算数右移,最高位补最高位,如-50(补码:1100 1110)算数右移两位是-13,对应二进制:1111 0011(补码)
  • 逻辑右移,最高位补0,如-50逻辑右移两位是51,对应的二进制表示:0011 0011(补码)

将一个数左移 k位,等价于将这个数乘以 2 k 2^k 2k。当乘数不是 2 的整数次幂时,可以将乘数拆成若干项 2 的整数次幂之和,例如, a × 6 a×6 a×6等价于 ( a < < 2 ) + ( a < < 1 ) (a<<2)+(a<<1) (a<<2)+(a<<1)。算术右移运算对应除法运算,将一个数右移 k 位,相当于将这个数除以 2 k 2^k 2k,结果向下取整。

位运算常用技巧

  • 幂等律: a & a = a a \& a=a a&a=a a ∣ a = a a∣a = a aa=a(注意异或不满足幂等律);

  • 交换律: a & b = b & a a \& b = b \& a a&b=b&a a ∣ b = b ∣ a a ∣ b = b ∣ a ab=ba a ⊕ b = b ⊕ a a ⊕ b = b ⊕ a ab=ba

  • 结合律: ( a & b ) & c = a & ( b & c ) (a \& b) \& c = a \& (b \& c) (a&b)&c=a&(b&c)

    ( a ∣ b ) ∣ c = a ∣ ( b ∣ c ) (a ∣ b) ∣ c = a ∣ (b ∣ c) (ab)c=a(bc)

    ( a ⊕ b ) ⊕ c = a ⊕ ( b ⊕ c ) (a ⊕ b) ⊕ c = a ⊕ (b ⊕ c) (ab)c=a(bc)

  • 分配律: ( a & b ) ∣ c = ( a ∣ c ) & ( b ∣ c ) (a \& b) ∣ c = (a ∣ c) \& (b ∣ c) (a&b)c=(ac)&(bc)

    ( a ∣ b ) & c = ( a & c ) ∣ ( b & c ) (a ∣ b) \& c = (a \& c) ∣ (b \& c) (ab)&c=(a&c)(b&c)

    ( a ⊕ b ) & c = ( a & c ) ⊕ ( b & c ) (a ⊕ b) \& c = (a \& c) ⊕ (b \& c) (ab)&c=(a&c)(b&c)

  • 德摩根律: ∼ ( a & b ) = ( ∼ a ) ∣ ( ∼ b ) , ∼ ( a ∣ b ) = ( ∼ a ) & ( ∼ b ) ∼(a \& b) = (∼a) ∣ (∼b),∼(a ∣ b) = (∼a) \& (∼b) (a&b)=(a)(b)(ab)=(a)&(b)

  • 取反运算性质: − 1 = ∼ 0 , − a = ∼ ( a − 1 ) −1 = ∼0,−a = ∼(a−1) 1=∼0a=∼(a1)

  • 与运算性质: a & 0 = 0 a \& 0 = 0 a&0=0 a & ( − 1 ) = a a \& (−1) = a a&(1)=a a & ( ∼ a ) = 0 a \& (∼a) = 0 a&(a)=0

  • 或运算性质: a ∣ 0 = a a ∣ 0 = a a0=a

  • 异或运算性质: a ⊕ 0 = a a ⊕ 0 = a a0=a a ⊕ a = 0 a ⊕ a=0 aa=0

如何获取、设置和更新某个为位的数据,也有固定的套路。

  1. 获取

    将1左移i位,得到形如0001 0000的值。接着对这个值与num执行&操作,从而将i位之外的所有位清零,最后检查结果是否为0。不为0说明i位为1,否则i位为0。

    function getBit(num, i) {return ((num & (1<<i)) !== 0);
    }
    
  2. 设置(将某一位设置为1)

    先将1左移i位,得到形如0001 0000的值,接着对这个值和num执行|操作,这样只会改变i位的数据。这样做则会使除i位外的位均为0,故不会影响num的其余位。

    function setBit(num, i) {return (num | (1<<i));
    }
    
  3. 清零(将某一位设置为0)

    该方法与setBit相反,首先将1左移i位,得到形如0001 0000的值,接着对这个值取反进而得到类似1110 1111的值,接着对该值执行&操作,故而不会影响到num的其余位,只会清零i位。

    function clearBit(num, i) {let mask = ~(1<<i)return num & mask;
    }
    
  4. 更新

    该方法将setBitclearBit结合,首先用如1110 1111的值将num的第i位清零。接着将待写入值v左移i位,得到一个i位为v但其余位都为0的数。最后对之前的结果执行| 操作,v为1则numi位更新为1,否则为0:

    function updateBit(num, i, v) {let mask = ~(1<<i);return (num & mask) | (v<<i);
    }
    

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

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

相关文章

6. 使用python将多个Excel文件合并到同一个excel-附代码解析

【目录】 文章目录 6. 使用python将多个Excel文件合并到同一个excel-附代码解析1. 目标任务2. 结果展示3. 代码示例4. 代码解析4.1 导入库4.2 调用库的类、函数、变量语法4.3 os.listdir-返回目录中的文件名列表4.4 startswith-用于判断一个字符串是否以指定的前缀开头4.5 ends…

Netty入门学习和技术实践

Netty入门学习和技术实践 Netty1.Netty简介2.IO模型3.Netty框架介绍4. Netty实战项目学习5. Netty实际应用场景6.扩展 Netty 1.Netty简介 Netty是由JBOSS提供的一个java开源框架&#xff0c;现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具&…

Docker 将容器打包成镜像推送镜像到仓库

Docker 将容器打包成镜像&推送镜像到仓库 一、将容器打包成镜像 $ docker commit <容器ID> <镜像名称:标签>示例&#xff1a; $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …

数字孪生:重塑制造、医疗和能源等领域的未来

数字孪生技术&#xff0c;作为虚拟仿真的重要领域&#xff0c;正以其强大的能力在各个行业中创造前所未有的创新。本文带大家一起深入探讨数字孪生技术在不同领域的广泛应用场景&#xff0c;展示其在实现效率、可靠性和智能化方面的积极影响。 制造业与工业领域 数字孪生技术在…

Python+TinyPNG熊猫网站自动化的压缩图片

前言 本篇在讲什么 PythonTinyPNG自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖TinyPNG工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449;…

抽象类和接口有什么区别?

在 Java 中&#xff0c;抽象类和接口是两种不同的类类型。它们都不能直接实例化&#xff0c;并且它们都是用来定义一些基本的属性和方法的&#xff0c;但它们有以下几点不同&#xff1a; 定义不同&#xff1a;定义的关键字不同&#xff0c;抽象类是 abstract&#xff0c;而接口…

ATF(TF-A)安全通告 TFV-2 (CVE-2017-7564)

安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-2 (CVE-2017-7564) 二、 CVE-2017-7564 一、ATF(TF-A)安全通告 TFV-2 (CVE-2017-7564) Title 启用安全自托管侵入式调试接口&#xff0c;可允许非安全世界引发安全世界panic CV…

【LeetCode75】第三十七题 二叉树中的最长交错路径

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一棵二叉树&#xff0c;问我们在这棵树里能找到的最长交错路径。最长交错路径就是在二叉树里一左一右一左一右这样走&#xff0c;最…

java- ConcurrentHashMap 并发

1. ConcurrentHashMap 并发 1.1. 减小锁粒度 减小锁粒度是指缩小锁定对象的范围&#xff0c;从而减小锁冲突的可能性&#xff0c;从而提高系统的并发能力。减小锁粒度是一种削弱多线程锁竞争的有效手段&#xff0c;这种技术典型的应用是 ConcurrentHashMap(高性能的 HashMap)…

RT1050的ADC

文章目录 1 ADC介绍2 ADC框图2.1 外部输入通道2.2 输入电压范围2.3 触发源2.4 时钟源2.5 偏移矫正功能2.5.1 校准 1 ADC介绍 RT1052 有 2 个 ADC&#xff0c;每个 ADC 有 12 位、10 位、8 位可选&#xff0c;每个 ADC 有 16 个外部通道。 ADC具有最高 1MS/s 采样率支持单次或…

23.树表和哈希表的查找

当表插入、删除操作频繁时&#xff0c;为维护表的有序性&#xff0c;需要移动表中很多记录。基于此&#xff0c;我们可以改用动态查找表——几种特殊的树。表结构在查找过程中动态生成。对于给定值key&#xff0c;若表中存在&#xff0c;则成功返回&#xff1b;否则&#xff0c…

【微服务】Ribbon的实现原理

1、场景&#xff1a;这里有两个服务&#xff0c;user-server和store-server 1.1、user服务 接口&#xff1a; package com.lkx.user.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController…

HashTable, HashMap, ConcurrentHashMap 之间的区别

前言 哈希表的组织形式是这样的&#xff1a; 对于哈希表这种重要而又频繁被使用的数据结构&#xff0c;是否线程安全往往是人们经常考虑的方向之一。 一、HashTable HashTable是线程安全的。但是它的线程安全在于它的关键方法都使用了synchronized&#xff0c;比如get方法、pu…

Python | assert关键字

Python断言assert是帮助代码流畅的调试工具。断言主要是假设程序员知道或总是希望是真的&#xff0c;因此将它们放在代码中&#xff0c;这样这些失败不会允许代码进一步执行。 简单地说&#xff0c;断言是一个布尔表达式&#xff0c;用来检查语句是True还是False。如果语句为T…

R包开发-2.2:在RStudio中使用Rcpp制作R-Package(更新于2023.8.23)

目录 4-添加C函数 5-编辑元数据 6-启用Roxygen&#xff0c;执行文档化。 7-单元测试 8-在自己的计算机上安装R包&#xff1a; 9-程序发布 参考&#xff1a; 为什么要写这篇文章的更新日期&#xff1f;因为R语言发展很快&#xff0c;很多函数或者方式&#xff0c;现在可以使…

js中作用域的理解?

1.作用域 作用域&#xff0c;即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变量和其他资源的可见性 举个例子 function myFunction() {let inVariable "函数内部变量"; } myFunction();//要先执行这…

NPM 管理组织包

目录 1、关于组织范围和包 1.1 管理无作用域的包 2、使用组织设置配置npm客户端 2.1 配置您的npm客户端以使用您组织的范围 为所有新包设置组织范围 为单个包设置组织范围 2.2 将默认包可见性更改为public 将单个包的包可见性设置为public 将所有包的包可见性设置为pu…

人脸识别平台批量导入绑定设备的一种方法

因为原先平台绑定设备是通过一个界面进行人工选择绑定或一个人一个人绑定设备。如下&#xff1a; 但有时候需要在几千个里选择出几百个&#xff0c;那这种方式就不大现实了&#xff0c;需要另外一种方法。 目前相到可以通过导入批量数据进行绑定的方式。 一、前端 主要是显示…

opencv进阶18-基于opencv 决策树导论

1. 什么是决策树&#xff1f; 决策树是最早的机器学习算法之一&#xff0c;起源于对人类某些决策过程 的模仿&#xff0c;属于监督学习算法。 决策树的优点是易于理解&#xff0c;有些决策树既可以做分类&#xff0c;也可以做回归。在排名前十的数据挖掘算法中有两种是决策树[1…

软件设计师学习笔记6-存储系统

1.层次化存储体系 1.1层次化存储结构 局部性原理是层次化存储结构的支持 时空局部性&#xff1a;刚被访问的内容&#xff0c;立即又被访问(eg: 循环体 ) 空间局部性&#xff1a;刚被访问的内容&#xff0c;临近的空间很快被访问(eg:数组) 1.2层次化存储结构的分类 DRAM&…