位运算
位运算(Bitwise Operations)是一种对二进制位进行操作的运算。它们在计算机科学和计算机编程中非常常见,用于对二进制数据进行位级别的操作和处理。
类型
位运算主要用于操作整数类型,因为它们是基于二进制位的操作。这包括整数类型(如整型数和无符号整型数)和字符类型(如ASCII字符)。
-
带符号整数类型:如
int、long、short、byte
等。这些类型的整数可以表示正数、负数和零,使用补码表示。 -
无符号整数类型:如
unsigned int、unsigned long、unsigned short
等。这些类型的整数只能表示非负数和零,不使用符号位,通常采用纯二进制表示。 -
字节类型:如
char
。字节类型通常用于表示字符,但它们也可以被当作整数类型来进行位运算。
但是,某些编程语言也允许对其他数据类型进行位运算,例如布尔类型(bool
)或位集合类型。在这些情况下,位运算通常被用于处理各个位的标志位或位集合的操作。
对于非整数类型,位运算操作的结果可能会受到数据类型的限制和语言规范的影响。
优势
位运算操作是由处理器支持的底层操作,底层硬件只支持01这样的数字,因此位运算运行速度很快。
尽管现代计算机处理器拥有了更长的指令流水线和更优的架构设计,使得加法和乘法运算几乎与位运算一样快,但是位运算消耗更少的资源。
运算符
以下是常见的位运算操作符:
-
与运算(
AND
):用符号"&"
表示,对两个操作数的对应位进行逻辑与操作,只有在两个操作数对应位都为1时,结果位才为1,否则为0。
(1&1=1,1&0=0,0&0=0
) -
或运算(
OR
):用符号"|"
表示,对两个操作数的对应位进行逻辑或操作,只要两个操作数对应位的其中一个为1,结果位就为1,否则为0。
(1|1=1 ,1|0=1, 0|0=0
) -
异或运算(
XOR
):用符号"^"
表示,对两个操作数的对应位进行异或操作,只有在两个操作数对应位不同时,结果位才为1,否则为0。
(1^1=0, 1^0=1, 0^0=0
) -
非运算(
NOT
):用符号"~"
表示,对操作数的每一位进行取反操作,即将1变为0,0变为1。
(~1=0, ~0=1
) -
左移运算(
Left Shift
):用符号"<<"
表示,将一个操作数的二进制位向左移动指定的位数,右侧空出的位用0填充。 -
右移运算(
Right Shift
):用符号">>"
表示,将一个操作数的二进制位向右移动指定的位数,左侧空出的位用原来的符号位填充。
在执行右移操作时,若参与运算的数字为正数,则在高位补0;若为负数,则在高位补1。 -
无符号右移:无符号右移通常使用
">>>"
运算符表示。无符号右移是一种位运算操作,用于将一个整数的二进制表示向右移动指定的位数,右侧空出的位用0填充。它不考虑符号位,直接将位移出整数的右侧。
这些位运算操作符可以用于进行位级别的掩码操作、位操作数的提取和设置、标志位的处理等。它们在一些底层的计算机操作、位字段处理和优化算法中经常使用。
左移(右移)运算符对数据的影响
左移运算符(<<
)用于将一个数的二进制表示向左移动指定的位数,右侧空出的位用0填充。左移运算可以对数值进行扩大,其效果相当于将数值乘以2的移位次幂。
左移运算符对数据的影响如下:
-
将一个数左移n位,相当于将该数乘以2的n次幂。
-
左移操作会改变原始数值的二进制表示,向左移动的位数将会导致右侧空出的位填充为0。
-
左移操作可能会导致数值溢出。如果左移后的结果超出了数据类型的表示范围,那么将会丢失高位的部分,只保留低位的有效值。
以下是一个示例,展示了如何使用左移运算符对一个数进行左移操作:
int num = 42;
int shiftAmount = 2;
int result = num << shiftAmount;
System.out.println(result);
在上述示例中,初始的数值 num
为 42,将其左移2位后得到结果 168。通过左移运算符 <<
将数值42向左移动2位,相当于将数值乘以2的2次幂,即 42 * (2^2) = 168。
需要注意的是,左移运算符的移位次数不能超过数据类型的位数。在某些编程语言中,移位次数超过数据类型的位数是未定义的行为,可能导致意外结果或错误。因此,在进行左移运算时,需要确保移位次数在合法的范围内。
左移是乘以2的n次幂,对应着右移则是除以2的n次幂。
Int 二进制
int
类型是一个整数类型,通常由32位二进制表示。在大多数编程语言中,int
类型采用补码表示法,其中最高位为符号位(0表示正数,1表示负数),其余的31位用于表示数值部分。
Int 2 转换成二进制:
00000000 00000000 00000000 00000010
补码表示法范围:
-2^31 ~ 2^31-1
(10000000 00000000 00000000 00000000
~ 01111111 11111111 11111111 11111111)
注:编程语言通常提供了转换函数或方法,如 Java 中的 Integer.toBinaryString(),可以方便地将 int 类型转换为二进制字符串进行输出。