Java教程

神奇的位操作

本文主要是介绍神奇的位操作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 位操作用法总结
    • 位操作总述
    • 一 :<< 左移
    • 二: >> 右移
    • 三: & 与运算
    • 四: | 或运算
    • 五: ~ 非运算
    • 六: ^ 异或

位操作用法总结

位操作总述

  • 计算机使用的二进制,位运算就是对一个比特(Bit)位进行操作运算的方法。
  • 位操作语法规则如下表所示:
运算符含义说明
<<左移将操作数的各个位全部左移若干位,高位丢弃,低位补0
>>右移将操作数的各个位全部右移若干位,低位丢弃,高位补 0 或 1
&与运算有0出0,全1出1
|或运算有1出1,全0出1
~非运算(取反)空即是色,色即是空
^异或相异出1,相同出0
  • 位运算应用口诀 :

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

一 :<< 左移

  1. 语法规则 :
    左移运算符<<用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补0
  2. 用法1:
    如果数据较小,被丢弃的高位不包含 1,那么左移 n 位相当于乘以 2 的 n 次方: << 相当于:*
int a, b;
b = a << 3;  // 相当于 b = a * 8
  1. 用法2:
    将 int 型变量a的第k位清 0
a &= ~(1 << k)
  1. 用法3:
    将 int 型变量a的第k位置1
a |= (1 << k)
  1. 用法4:
    将 int 型变量循环左移k次
a = (a << k) | (a >> (sizeof(int)-k))

二: >> 右移

  1. 语法规则:
    右移运算符 >> 用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1;如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1。
  2. 用法1:
    如果被丢弃的低位不包含 1,那么右移 n 位相当于除以 2 的 n 次方: >>相当于:/
int a, b;
b = a >> 3;// 相当于除以 b = a / 8
  1. 用法2:
    取 int 型变量a的第k位 (k=0,1,2……sizeof(int))
a >> k & 1
  1. 用法3:
    int 型变量a循环右移k次
a = a >> k | a << (sizeof(int)-k)

三: & 与运算

  1. 语法规则:
    一个比特(Bit)位只有 0 和 1 两个取值,只有参与 & 运算的两个位都为 1 时,结果才为 1,否则为 0
  2. 用法1:
    检查整数是否为 2 的倍数
isEven = (i & 1) == 0; // 等价于: (i % 2) == 0;
  1. 用法2:
    取余数,如果除数为 2 的倍数,& 可相当于:%
num & (2^n - 1) // 等价于 :num % 2^n 
  1. 用法3:
    判断 int 型变量是 奇数 还是 偶数
 if( a & 1 == 0 ) // 偶数
 if( a & 1 == 1 ) // 奇数

四: | 或运算

  1. 语法规则:
    参与|运算的两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0
  2. 用法1:
    将 a 的第 k 位置 1
a = a | (1 << k)

五: ~ 非运算

  1. 语法规则:
    又叫取反运算符,~ 为单目运算符,右结合性,作用是对参与运算的二进制位取反,0 变成 1,1 变成 0
  2. 用法1:
    求 x 的相反数 y
y = ~x + 1;

六: ^ 异或

  1. 语法规则:
    参与^运算两个二进制位不同时,结果为 1,相同时结果为 0
  2. 用法1:
    交换两个数值
a = a^b;
b = a^b;
a = a^b;
  1. 用法2:
x = a ^ b ^ x;
// 等价于 :
if (x == a) {
	x = b;
}else{
	x = a;
} 

感谢阅读,如有错误,敬请见谅!!!


这篇关于神奇的位操作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!