位运算全解

如题所述

第1个回答  2022-06-08

位运算是以二进制为单位的运算,其操作数和运算结果都是整数值。

 &  位与 x&y
 |   位或 x|y
 ~  位非 ~x
 ^   位异或 ^x
 >> 右移 x>>y
 << 左移 x<<y
 >>> 无符号右移 x>>>y
除了^为一元其余都为二元运算。

&规定两对应位都为1则为1,否则为0
| 规定两对应位其中有1则为1,否则0
^规定两对应位相同则为1,不同为0
~规定两对应位按位求补
 <<将二进制数按指定左移几位,移掉的省略,右边缺失的位,用0补齐
 >>将二进制数按指定右移几位,移掉的省略,左边缺失的位,(该数是正数)用0补齐,(该数是负数)用1补齐
 >>>将二进制数按指定右移几位,移掉的省略,左边缺失的位,用0补齐

位运算口诀:
清零取反要用与,某位置一可用或
若要取反和交换,轻轻松松用异或

口诀好记,但是计算的时候得要十分有耐心,睁大你的眼,死死地盯着位数,位运算这货就像高中时填写的机读卡。

位运算操作的优先级比较低,如int a = 1<<i+1,程序会先计算i+1,再左移操作。

例子1 :a=15,b=6计算 a&b:

例子2: a=-6,b=-2,计算a&b:
首先得到6的二进制,00000110
负数的二进制需要该数 正数按位取反+1
11111001 加1为 11111010
同理的-2的二进制 11111110
得到的11111010为负数,的到该正数需要-1按位取反。
计算过程:

法则一:任何数左移(右移)32位的倍数等于该数本身。
法则二:在位移运算m<<n计算中,若n为正数,则实际移动的位数为n%32,若n为负数,则实际移动的位数为32+n%32,右移同理。

左移动1位,各位数计算都会乘以2;右移1位,各位数计算都会除以2。
所以x<<N,x乘以2的N次方;x>>N,x除以2的N次方;
80>>2 80÷2²=20
5<<3 5x2³=40
-70>>2 -70÷2²=-18

那么问题又来了,-1>>>1是多少?
计算过程:

竟然得到了int能表示的最大值Integer.MaxValue。

使用位运算能神奇地解决日常中某些计算,就像你费了九牛二虎之力终于从一个字符串中过滤出了想要的内容,但是人家一个正则匹配就粗来了,留下你记几在冷风中沉思。

他说了句,low逼,还用这个,然后写出了

计算过程:
(记住任何数异或自己都为0;任何数异0都为本身;进行异或的数可以无序交换)

实现了a和b交换值

位运算全解
位运算是以二进制为单位的运算,其操作数和运算结果都是整数值。 &  位与 x&y  |   位或 x|y  ~  位非 ~x  ^   位异或 ^x  >> 右移 x>>y  << 左移 x<...

10394 用位运算速解 n 皇后问题
解法一(步步回眸)虽然基础,但效率低,解13皇后需要89秒。解法二(雁过留痕)通过标记竖、撇、捺的位置,检查冲突时间减至O(1),解13皇后用时14秒。解法三(以一当百)引入位运算,但空间优化并未显著提升速度,24秒。真正突破的是解法四(弹无虚发),通过位运算快速枚举可放置皇后的位置,13...

详解C++按位与、或、异或运算
C++的位运算符按位与(&), 按位或(|), 和异或(^)在编程中有着重要的应用。它们都是针对二进制位进行操作,对于负数,需使用补码形式参与运算。首先,按位与(&)的规则是:0与0结果为0,0与1结果为0,1与0结果为0,1与1结果为1。它可以用来清零、取特定位或判断奇偶性。例如,通过与一个全...

或计算机位运算
在计算机编程中,位运算是一种基本的逻辑操作,特别是在汇编语言和C++等高级语言中扮演重要角色。其中,按位或(or)操作符,通常表示为 "|",其工作原理可以直观地通过真值理解。当两个二进制位进行按位或运算时,如果两个位都是1,结果将是1;如果有一个是0,结果仍是1;只有当两个都是0时,结...

MySQL算术\/比较\/逻辑\/位\/运算符与正则全解
MySQL中的算术\/比较\/逻辑\/位\/运算符以及正则表达式全解提供了丰富的功能,它们在数据处理中扮演着关键角色。以下是各部分的简要概述:1. **算术运算符**:用于执行加、减、乘、除和取模操作。例如,筛选employee_id为偶数的员工:`SELECT * FROM employees WHERE employee_id % 2 = 0`。2. **...

C语言中很难理解的部分
1、按位与运算常用于取一个数中的某些指定位。如取整型数a的低8位,只要用a和0377按位与就可以了。2、按位或运算常用于将一个数的某些位置1。如将整型数a的低8位全置1,只要用a和0377按位或即可。3、按位异或运算常将一个数的某些位翻转,即0变1,1变0.如:将整型数a的低8位翻转,...

...算术运算符|比较运算符|逻辑运算符|位运算符
逻辑与 (and): 只有全为真时结果才为真。逻辑或 (or): 只要有一个为真结果即为真。逻辑非 (not): 对布尔值取反。理解这些运算符时,注意Python中非零或非空被视为真。5. 位运算符针对整数的二进制位操作,如:按位与 (&):位级的与操作。按位或 (|): 位级的或操作。按位异或 (^)...

如何理解vba中逻辑运算符的位运算符
逻辑运算符的位运算是按位运算,不管什么进制,均转化为二进制,然后从低位开始按位比较,得出不同的逻辑比较结果值。Or 逻辑比较是:有1出1,全0出0;Xor逻辑比较是:同0异1。Or 运算符对两个数值表达式中位置相同的位进行逐位比较,并根据下表对 result 中相应的位进行设置:expression1 的位为 ...

关于C语言的基础问题。(位运算、补码)
补码表示有符号数时,第一位表示正负号,1为-,0为+,所以i是0xFFFFFF,全部为1,则i为负数,当其为负数时,值的求法是去掉符号位,剩下的取反+1,那么就是0+1=1,所以i的值是-1 要理解为什么不同应该先去看一下补码的编码规则,而不是看二进制的运算 进制之间的转换可以看看http:\/\/hi....

深入理解计算机系统(十七):特殊的算术操作指令
深入理解计算机系统(十七):特殊的算术操作指令 在探讨计算机系统底层操作时,我们了解到IA32架构中存在一些针对64位运算的特殊算术操作指令。这些指令处理全64位的乘积和整数除法,但寄存器的使用有限,例如imull和mull指令。imull指令可进行单操作数乘法,与之前的乘法指令不同,它将高32位结果存入%edx,低...

相似回答
大家正在搜