位运算

作者: 云莉6 | 来源:发表于2020-05-05 21:26 被阅读0次

参考:位操作

概念

位运算是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运输要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。

位运算符

取反(NOT)

取反是一元运算符,对一个二进制数的每一位执行逻辑反操作。是数字 1 成为 0,0 成为 1。例如:

NOT 0111(十进制 7)
= 1000(十进制 8)

许多程序设计语言(包括 C 程序设计语言 family),取反操作符用波浪线 ~ 表示。值得注意的是此操作符与「逻辑非(!)」操作符不同。在 C++ 中,逻辑非将数字整体看做一个布尔类型—将真值转化为假,将假值转化为真;而 C 语言将 0 转化为 1,将非零转化为 0。「逻辑非(!)」并不是一个位操作。

按位或(OR)

按位或处理两个长度相同的二进制数,两个相应的二进位中只要有一个为 1,该位的结果值为 1。例如:

   0101(十进制5)
OR 0011(十进制3)
 = 0111(十进制7)

在 C 类程序设计语言中,按位或操作符是 | 。这一操作符需要与逻辑或运算符(||)区别开来。

按位异或(XOR)

按位异或运算 ,对等长二进制模式或二进制数的每一位执行逻辑异或操作。操作的结果是如果某位不同则该位为 1,否则该位为 0;例如:

    0101
XOR 0011
  = 0110

在类 C 语言中,按位异或运算符是 ^

汇编语言的程序员们有时使用按位异或运算 作为。将寄存器的值设为 0 的捷径。用值的自身对其执行按位异或运算将得到 0。并且 在许多架构中,与直接 记载 0 值并将它保存到寄存器相比,按位异或运算需要较少的中央处理单元时钟周期。

按位异或也可以用于在比特集合中切换旗帜。

    0010
XOR 1010
  = 1000

0010 第一位和第三位能够 通过 按位 异或运算使用同时切换。这一技巧 可用于操作表示布尔变量的比特模式。

按位与(AND)

按位与处理两个长度相同的二进制数,两个相应的二进位都为 1,该位的结果值才位 1,否则为 0。例如:

    0101
AND 0011
  = 0001

在类 C 语言中,按位与用 & 表示。

移位

移位是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。在类 C 语言中,左移使用两个小于符号 << 表示,右移使用两个大于符号 >> 表示。

逻辑移位

应用逻辑移位时,移位后空缺的部分全部填 0。

    0001(十进制 1)
 <<    3(左移 3 位)
  = 1000(十进制 8)
    1000(十进制 10)
 >>    2(右移 2 位)
  = 0010(十进制 2)

Java 中的移位

Java 中有一个特有的无符号右移操作符 >>>。此操作将忽略操作数的符号,同样的还有 >>>=

指定位置的位运算

  1. 将 x 最右边的 n 位清零:x & (~0 << n)

  2. 获取 x 的第 n 位值(0 或者 1): (x >> n) & 1

  3. 获取 x 的第 n 位的幂值:x & (1 << (n -1))

  4. 仅将第 n 位置为 1:x | (1 << n)

  5. 仅将第 n 位置为 0:x & (~ (1 << n))

  6. 将 x 最高位至第 n 位(含)清零:x & ((1 << n) - 1)

  7. 将第 n 位至第 0 位(含)清零:x & (~ ((1 << (n + 1)) - 1))

实战位运算要点

  • 判断奇偶:
    x % 2 == 1 —> (x & 1) == 1
    x % 2 == 0 —> (x & 1) == 0
  • x >> 1 —> x / 2
    即: x = x / 2; —> x = x >> 1;
    mid = (left + right) / 2; —> mid = (left + right) >> 1;
  • X = X & (X-1) 清零最低位的 1
  • X & -X => 得到最低位的 1
  • X & ~X => 0

相关文章

  • 3、小众运算符の大课堂(一)

    较为简单の位运算符: & 位与运算| 位或运算^ 位异或运算~ 位取反运算 举例: 要做位运算,首先要把数据转...

  • 位运算及其应用

    内容概要: 位运算基本操作 基于位运算的状态压缩 位运算经典应用 位运算解N皇后问题 位运算 符号描述规则&与1&...

  • 位运算及用位运算实现权限控制

    请自行补习位运算相关知识 位运算 位运算示例 权限控制

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • 强大的位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作位取反运算符.png 位与运算符 位与运算符(&)可以...

  • 位运算

    位运算 1. &:按位与 规律:一假则假任何位上的数和1相&得到的结果还是那个数 2. |:按位或 规律:一真则真...

  • 位运算

    https://leetcode.com/problems/gray-code/description/这个位运算...

  • 位运算

    位运算符比一般的算术运算符速度要快,而且可以实现一些算术运算符不能实现的功能。如果要开发高效率程序,位运算符是必不...

  • 位运算

    1.不用加减乘除做加法 解法:分为三步①各位相加不进位,即先按位异或;②做进位,按位与并左移位;③结果相加,直至没...

  • 位运算

    位运算不仅可以简化某些复杂的操作,而且具有更快的计算速度。典型的应用就是除法,交换两个数值,以及在一个数组中寻找只...

网友评论

    本文标题:位运算

    本文链接:https://www.haomeiwen.com/subject/ruwvghtx.html