位运算(Java 二进制运算)

位运算

位运算(Bitwise Operations)是一种对二进制位进行操作的运算。它们在计算机科学和计算机编程中非常常见,用于对二进制数据进行位级别的操作和处理。

类型

位运算主要用于操作整数类型,因为它们是基于二进制位的操作。这包括整数类型(如整型数和无符号整型数)和字符类型(如ASCII字符)。

  1. 带符号整数类型:如int、long、short、byte等。这些类型的整数可以表示正数、负数和零,使用补码表示。

  2. 无符号整数类型:如unsigned int、unsigned long、unsigned short等。这些类型的整数只能表示非负数和零,不使用符号位,通常采用纯二进制表示。

  3. 字节类型:如char。字节类型通常用于表示字符,但它们也可以被当作整数类型来进行位运算。

但是,某些编程语言也允许对其他数据类型进行位运算,例如布尔类型(bool)或位集合类型。在这些情况下,位运算通常被用于处理各个位的标志位或位集合的操作。

对于非整数类型,位运算操作的结果可能会受到数据类型的限制和语言规范的影响。

优势

位运算操作是由处理器支持的底层操作,底层硬件只支持01这样的数字,因此位运算运行速度很快。
尽管现代计算机处理器拥有了更长的指令流水线和更优的架构设计,使得加法和乘法运算几乎与位运算一样快,但是位运算消耗更少的资源。

运算符

以下是常见的位运算操作符:

  1. 与运算(AND):用符号 "&" 表示,对两个操作数的对应位进行逻辑与操作,只有在两个操作数对应位都为1时,结果位才为1,否则为0。
    ( 1&1=1,1&0=0,0&0=0 )

  2. 或运算(OR):用符号 "|" 表示,对两个操作数的对应位进行逻辑或操作,只要两个操作数对应位的其中一个为1,结果位就为1,否则为0。
    (1|1=1 ,1|0=1, 0|0=0)

  3. 异或运算(XOR):用符号 "^" 表示,对两个操作数的对应位进行异或操作,只有在两个操作数对应位不同时,结果位才为1,否则为0。
    (1^1=0, 1^0=1, 0^0=0)

  4. 非运算(NOT):用符号 "~"表示,对操作数的每一位进行取反操作,即将1变为0,0变为1。
    ~1=0, ~0=1

  5. 左移运算(Left Shift):用符号 "<<" 表示,将一个操作数的二进制位向左移动指定的位数,右侧空出的位用0填充。

  6. 右移运算(Right Shift):用符号 ">>"表示,将一个操作数的二进制位向右移动指定的位数,左侧空出的位用原来的符号位填充。
    在执行右移操作时,若参与运算的数字为正数,则在高位补0;若为负数,则在高位补1。

  7. 无符号右移:无符号右移通常使用 ">>>" 运算符表示。无符号右移是一种位运算操作,用于将一个整数的二进制表示向右移动指定的位数,右侧空出的位用0填充。它不考虑符号位,直接将位移出整数的右侧。

这些位运算操作符可以用于进行位级别的掩码操作、位操作数的提取和设置、标志位的处理等。它们在一些底层的计算机操作、位字段处理和优化算法中经常使用。

左移(右移)运算符对数据的影响

左移运算符(<<)用于将一个数的二进制表示向左移动指定的位数,右侧空出的位用0填充。左移运算可以对数值进行扩大,其效果相当于将数值乘以2的移位次幂。

左移运算符对数据的影响如下:

  1. 将一个数左移n位,相当于将该数乘以2的n次幂。

  2. 左移操作会改变原始数值的二进制表示,向左移动的位数将会导致右侧空出的位填充为0。

  3. 左移操作可能会导致数值溢出。如果左移后的结果超出了数据类型的表示范围,那么将会丢失高位的部分,只保留低位的有效值。

以下是一个示例,展示了如何使用左移运算符对一个数进行左移操作:

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-110000000 00000000 00000000 00000000 
 	~ 01111111 11111111 11111111 11111111)

注:编程语言通常提供了转换函数或方法,如 Java 中的 Integer.toBinaryString(),可以方便地将 int 类型转换为二进制字符串进行输出。

更多

https://blog.csdn.net/qq_42265220/article/details/118386893

猜你喜欢

转载自blog.csdn.net/weixin_35691921/article/details/105341039