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

源码、反码和补码

很多人都记不清源码、反码和补码的区分,都是二进制,其实记忆起来很简单,分为正数和负数来记。正数的原码、反码和补码都是一样的,负数的原码符号位为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.mzph.cn/news/56166.shtml

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

相关文章

【Linux的成长史】Linux的发展史

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集 数据库专栏 初阶数据结构 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如…

AIGC之GPT-4:GPT-4的简介(核心原理/意义/亮点/技术点/缺点/使用建议)、使用方法、案例应用(计算能力/代码能力/看图能力等)之详细攻略

AIGC之GPT-4&#xff1a;GPT-4的简介(核心原理/意义/亮点/技术点/缺点/使用建议)、使用方法、案例应用(计算能力/代码能力/看图能力等)之详细攻略 解读&#xff1a;在2022年11月横空出世的ChatGPT&#xff0c;打遍天下无敌手的时候&#xff0c;就知道会有这么一天&#xff0c;知…

深度学习12:胶囊神经网络

目录 研究动机 CNN的缺陷 逆图形法 胶囊网络优点 胶囊网络缺点 研究内容 胶囊是什么 囊间动态路由算法 整体框架 编码器 损失函数 解码器 传统CNN存在着缺陷&#xff08;下面会详细说明&#xff09;&#xff0c;如何解决CNN的不足&#xff0c;Hinton提出了一种对于图…

spark中排查Premature EOF: no length prefix available

报错信息 /07/22 10:20:28 WARN DFSClient: Error Recovery for block BP-888461729-172.16.34.148-1397820377004:blk_15089246483_16183344527 in pipeline 172.16.34.64:50010, 172.16.34.223:50010: bad datanode 172.16.34.64:50010 [DataStreamer for file /bdp/data/u9…

Linux —— nfs文件系统

简介 NFS 是Network File System的缩写&#xff0c;即网络文件系统。一种使用于分散式文件系统的协定&#xff0c;由Sun公司开发&#xff0c;于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据&#xff0c;让应用程序在客户端通过网络访问位…

apex和pl/sql学习记录2

验证后过程函数代码插眼儿 -- 登录后验证过程3 create or replace PROCEDURE TEST_USER_WXX3_PRO ASV_USER_ID NUMBER(20);V_ROLE_ID NUMBER(20);V_PERM_ID NUMBER(20);V_DEPT_ID NUMBER(20);V_USER_NAME NVARCHAR2(64);V_JOB_NUMBER NVARCHAR2(32);V_M…

Hbuild 打包H5项目

1、输入用户信息登录Hbuilder编辑器&#xff1b; 2、进入manifest.json配置文件&#xff1b;获取AppID信息&#xff1b;&#xff08;可以点击DCloud AppID使用说明进行查看详情&#xff09; 3、进入DCloud开发者中心https://dev.dcloud.net.cn/&#xff1b;登录用户和密码&…

Linux目录结构与文件管理 (02)(四)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、查看文件内容 二、创建文件 三、删除文件 四、 移动文件 五、复制文件 六、编辑文件内容 总结 前言 今天是在昨天的基础上继续学习&#xff0c;主要…

【VLDB 2023】基于预测的云资源弹性伸缩框架MagicScaler,实现“高QoS,低成本”双丰收

开篇 近日&#xff0c;由阿里云计算平台大数据基础工程技术团队主导&#xff0c;与计算平台MaxCompute团队、华东师范大学数据科学与工程学院、达摩院合作&#xff0c;基于预测的云计算平台资源弹性伸缩框架论文《MagicScaler: Uncertainty-aware, Predictive Autoscaling 》被…

Flutter实现动画列表AnimateListView

由于业务需要&#xff0c;在打开列表时&#xff0c;列表项需要一个从右边飞入的动画效果&#xff0c;故封装一个专门可以执行动画的列表组件&#xff0c;可以自定义自己的动画&#xff0c;内置有水平滑动&#xff0c;缩放等简单动画。花里胡哨的动画效果由你自己来定制吧。 功…

StableVideo:使用Stable Diffusion生成连续无闪烁的视频

使用Stable Diffusion生成视频一直是人们的研究目标&#xff0c;但是我们遇到的最大问题是视频帧和帧之间的闪烁&#xff0c;但是最新的论文则着力解决这个问题。 本文总结了Chai等人的论文《StableVideo: Text-driven consistency -aware Diffusion Video Editing》&#xff…

学习Linux的注意事项(使用经验;目录作用;服务器注意事项)

本篇分享学习Linux过程中的一些经验 文章目录 1. Linux系统的使用经验2. Linux各目录的作用3. 服务器注意事项 1. Linux系统的使用经验 Linux严格区分大小写Linux中所有内容以文件形式保存&#xff0c;包括硬件&#xff0c;Linux是以管理文件的方式操作硬件 硬盘文件是/dev/s…

2023-08-23 LeetCode每日一题(统计点对的数目)

2023-08-23每日一题 一、题目编号 1782. 统计点对的数目二、题目链接 点击跳转到题目位置 三、题目描述 给你一个无向图&#xff0c;无向图由整数 n &#xff0c;表示图中节点的数目&#xff0c;和 edges 组成&#xff0c;其中 edges[i] [ui, vi] 表示 ui 和 vi 之间有一…

Linux(实操篇二)

Linux实操篇 Linux(实操篇二)1. 常用基本命令1.3 时间日期类1.3.1 date显示当前时间1.3.2 显示非当前时间1.3.3 date设置系统时间1.3.4 cal查看日历 1.4 用户管理命令1.4.1 useradd添加新用户1.4.2 passwd设置用户密码1.4.3 id查看用户是否存在1.4.4 cat /etc/passwd 查看创建了…

用香港服务器域名需要备案吗?

​  在选择服务器的时候&#xff0c;很多人会考虑使用香港服务器。香港服务器的一个优势就是不需要备案。不管是虚拟主机还是云主机&#xff0c;无论是个人网站还是商业网站&#xff0c;都不需要进行备案手续。 域名实名认证 虽然不需要备案&#xff0c;但使用香港服务器搭建…

基于Linux操作系统的keepalived双机热备和keepalived+lvs(DR)基本配置操作

目录 keepalived双机热备 一、概述 &#xff08;一&#xff09;具体工作原理如下&#xff1a; &#xff08;二&#xff09;实验拓补 二、安装NFS、配置 1、第一台机器配置&#xff1a;NFS &#xff1a;192.168.11.101 2、更改配置文件 3、安装NFS进行目录共享 4、编辑…

Linux 之 yum使用(yum 命令使用讲解)

yum使用 1.yum安装软件 yum -y install vim [rootlocalhost ~]# yum -y install vim 已加载插件&#xff1a;fastestmirror Bad id for repo: mirrors.aliyun.com_docker-ce_linux_centos_docker-ce.xn--repo()-mu8ig98h4l0hokj, byte ( 60 Loading mirror speeds from cac…

无涯教程-机器学习 - 矩阵图函数

相关性是有关两个变量之间变化的指示&#xff0c;在前面的章节中&#xff0c;无涯教程讨论了Pearson的相关系数以及相关的重要性&#xff0c;可以绘制相关矩阵以显示哪个变量相对于另一个变量具有较高或较低的相关性。 在以下示例中&#xff0c;Python脚本将为Pima印度糖尿病数…

jemter连接数据json断言

文章目录 一、jmeter连接数据库1、加载JDBC驱动2、连接数据3、SQL Query的Query Type使用方法&#xff1a;4、Variable Name使用方法&#xff1a;5、Result variable name使用方法&#xff1a; 二、Json响应断言1、添加 》 断言 》 JSON断言2、JSON断言界面参数说明&#xff1a…

【100天精通python】Day46:python网络编程基础与入门

目录 专栏导读 1 网络编程的基础 2. 基本概念和协议 2.1 计算机网络基础 2.2 网络协议、IP地址、端口号 2.3 常见网络协议 3. 套接字编程 3.1 套接字的基本概念 3.2 套接字的基本操作 3.3 套接字通信模型和方法&#xff1a;send、recv 3.3.1 TCP通信模型 3.3.2 U…