位运算记录

news/2024/7/8 7:51:03

作为在互联网领域工作的程序员啊,我们需要不断地学习。自己也坚持每天刷一两个 LeetCode 题目,在刷题的过程中,发现有不少题目都涉及到一些位运算的知识,这篇文章记录一下。

  • 介绍
  • 运算
    • 按位与(&)
    • 按位或(|)
    • 按位异或(^)
    • 左移(<<)
    • 右移(>>)
    • 取反(~)

介绍

位运算是把数字用二进制表示之后,对每一位上 0 或 1 的运算。

运算

接下来我们举一个例子一个个运用下方的运算符。

按位与(&)

将参与运算的两个数字,换算为二进制进行运算。只有当相应位上的数都是 1 时,该位取 1,否则取 0。

将数字 3 与 2 进行按位于运算

1 1		3的二进制
1 0		2的二进制  
————
1 0		结果的二进制,对应十进制数字为 2

所以:3 & 2 = 3
复制代码

按位或(|)

将参与运算的两个数字,换算为二进制进行运算。只要相应位上数是有 1 时,该位取 1,否则取 0。

将数字 3 与 2 进行按位或运算

1 1		3的二进制
1 0		2的二进制  
----
1 1		结果的二进制,对应十进制数字为 3    

所以:3 | 2 = 3
复制代码

按位异或(^)

将参与运算的两个数字,换算为二进制进行运算。只要相应位上数不相同时,该位取 1,否则取 0。

将数字 3 与 2 进行按位异或运算

1 1		3的二进制
1 0		2的二进制  
----
0 1		结果的二进制,对应十进制数字为 1

所以:3 ^ 2 = 1
复制代码

左移(<<)

将参与运算的两个数字,换算为二进制进行运算。将二进制位全部向左移动若干位,后续位置补 0 。

将数字 3 左移 2 位

1 1			3的二进制
1 1 0 0		左移两位。结果的二进制,对应十进制数字为 12

所以:3 << 2 = 12
复制代码

右移(>>)

将参与运算的两个数字,换算为二进制进行运算。将二进制位全部向右移动若干位,前面空出的位置补 0,后续移出的数字移除。

将数字 3 右移 2 位

1 1			3的二进制
0 0 1 1		
0 0			结果的二进制。右移两位,移出去的 1 移除。对应十进制数字为 0

所以:3 >> 2 = 0
复制代码

右移运算可用来代替除法,且效率会比除法更高。

利用右移运算代替除法。
将数字 3 右移 1 位。

1 1			3的二进制
0 1 1		
0 1			结果的二进制。右移两位,移出去的 1 移除。对应十进制数字为 1

所以:3 >> 1 = 1
复制代码

取反(~)

首先,我们需要知道计算机内部在做数学运算时,都是以补码为标准的。

关于原码、反码及补码的只是这里不多做介绍了。 这篇文章对这三个码进行了一些基本介绍。

这里我们说一些结论:

  • 正数的原码、反码及补码都一样。
  • 负数的原码最高位为 1 开头,反码是最高符号位不变,其余位在原码的基础上取反,补码在反码的基础上 +1 即可得到。

取反操作

将参与运算的两个数字,换算为二进制进行运算。每个位置上都取相反值,1 变成 0,0 变为 1。

例子1:对正数进行取反

对数字 3 进行取反。这里就利用 8 位来存储二进制数值。

0 0 0 0 0 0 1 1		3的二进制原码

1 1 1 1 1 1 0 0		取反之后得到结果的原码,我们需要转化为补码供计算机计算

1 0 0 0 0 0 1 1		根据原码得到结果的反码

1 0 0 0 0 1 0 0		上面反码基础上 +1 得到补码,其十进制值为 -4

所以:~3 = -4
复制代码

例子2:对负数进行取反

对数字 -4 进行取反。这里就利用 8 位来存储二进制数值。
其实只是将正数的过程反过来就好。

1 0 0 0 0 1 0 0		-4的二进制补码

1 0 0 0 0 0 1 1		在补码的基础上 -1 得到反码

1 1 1 1 1 1 0 0		根据反码得到其原码

0 0 0 0 0 0 1 1		每位取反之后得到结果的原码。结果的十进制为 3

所以:~(-4) = 3
复制代码

转载于:https://juejin.im/post/5d493fde6fb9a06b1e7f233a


http://www.niftyadmin.cn/n/4646367.html

相关文章

只手遮天

.. 用这个作为这~ 一连5篇的结束 .. 有感而发&#xff0c;写段文字 .. 读大学时&#xff0c;自我感觉不太会说话&#xff0c;显得相当的木纳&#xff0c;对许多人除了微笑讲不上几句 .. 如今&#xff0c;已经会说话&#xff0c;而且也会分场合 .. 说话时&#xff0c;我的话仍然…

spring boot 开启https

1.生成证书 keytool -genkey -alias tomcat -keyalg RSA -keystore E:/https.keystore将生成好的证书放在项目根目录即可 2 修改配置文件 server:port: 443servlet:context-path: /tomcat:uri-encoding: UTF-8max-threads: 1000min-spare-threads: 30ssl:#生成证书的名字key-st…

从github上的优秀实例看MVP模式

github上有一个关于MVP模式学习的实例https://github.com/antoniolg/androidmvp&#xff0c;虽然只有简单的几个类&#xff0c;却收获了几千个星。这个例子确实通俗易懂&#xff0c;直观的体现出了MVP模式的特点&#xff1a; 考虑这样一个需求&#xff0c;页面显示一个列表&…

显著减少项目gradle编译时间

原文来自https://zeroturnaround.com/rebellabs/making-gradle-builds-faster/ 1.对build过程进行配置实现编译优化&#xff1a; &#xff08;1&#xff09;首先了解如何用命令行进行编译&#xff1a; 使用git命令行进入项目根目录&#xff0c;然后执行 ./gradlew :app:asse…

CVE-2018-12613(远程文件包含)

问题在index.php的55~63行// If we have a valid target, lets load that script instead if (! empty($_REQUEST[target])&& is_string($_REQUEST[target])&& ! preg_match(/^index/, $_REQUEST[target])&& ! in_array($_REQUEST[target], $target_bl…

Support Design库中的BottomSheetDialog组件使用

首先来看这个组件使用的经典案例&#xff0c;微信公众号文章操作功能显示&#xff1a; 首先要知道BottomSheetDialog有两种&#xff0c;第一种弹出后不影响主界面交互&#xff0c;第二种弹出后主界面变暗不能交互&#xff0c;这里分别进行使用。 1.首先是普通的BottomSheetDia…

Netty内存池ByteBuf 内存回收

内存池ByteBuf 内存回收: 在前面的章节中我们有提到, 堆外内存是不受JVM 垃圾回收机制控制的, 所以我们分配一块堆外内存进行ByteBuf 操作时, 使用完毕要对对象进行回收, 本节就以PooledUnsafeDirectByteBuf 为例讲解有关内存分配的相关逻辑。PooledUnsafeDirectByteBuf 中内存…

Android 导入库文件在主工程使用不了库文件的代码

主工程不识别这个文件 但是我明明加入这个lib库了为什么使用不了呢&#xff1f; 原因在这里 将库文件里面的build.gradle中的依赖implementation转换成api 然后sync一下 酱酱酱~~~不报错啦 是不是超级简单&#xff1f;