java 左移>> 右移<< 无符号右移>>>和位运算符与& 或| 非~ 异或^ 实验

本文详细介绍了Java中的位运算,包括左移(<<)、右移(>>)、无符号右移(>>>)的操作原理及应用实例。同时,还深入探讨了位与(&)、位或(|)、位非(~)和位异或(^)等运算符的工作方式,并通过具体示例解释了它们如何在二进制位级别上进行操作。

java 左移>> 右移<< 无符号右移>>>

<< 左移,不管是正负,都补0

System.out.println(20<<2); 
 // 0001 0100(补码)<< 2 = 0101 0000 = 80

System.out.println(-20<<2); 
// 1110 1100(补码)<<2 = 1011 0000(补码) = 1101 0000(原码) = -80

>> 右移,如果是正数,补码右移的过程中高位补0,

如果是负数,补码右移的过程中,高位补1

System.out.println(20>>2);  
// 0001 0100(补码) >> 2 = 0000 0101 = 5


System.out.println(-20>>2);
// 1110 1100(补码) >> 2 = 1111 1011(补码) = 1000 0101(原码) = -5
//其实int类型有32位,这里我只写了8位

>>>无符号右移,不管正负,补码右移的过程中高位只补0

System.out.println(20>>>2); 
// 0001 0100(补码)>>> 2 = 0000 0101 = 5

System.out.println(-20>>>2);
// 10000000 00000000 00000000 00010100   -20的原码
// 11111111 11111111 11111111 11101100   -20的补码 >>>2
// 00111111 11111111 11111111 11111011   无符号右移2位后的补码
// 00111111 11111111 11111111 11111011   无符号右移2位后的原码,结果很大
// 1073741819

没有无符号左移
//    System.out.println(20<<<2);  报错


java 位运算符与& 或| 非~ 异或^ 实验

与运算 & ,补码对应位都为1时,结果才为1

System.out.println(5&9);
//   0000 0101 (补码)
// & 0000 1001 (补码)
// = 0000 0001 = 1

System.out.println(-5&-9);
//   1111 1011  -5的补码
// & 1111 0111  -9的补码
// = 1111 0011  结果(补码)
// = 1000 1101  结果(原码)
// = -13

System.out.println(-5&20); // 16
//   1111 1011  -5的补码
// & 0001 0100  20的补码
// = 0001 0000  结果的补码(原码)
// = 16

或运算 | ,补码对应位只要有一位为1时,结果补码的对应位就为1

System.out.println(5|8);  
//   0000 0101  5的补码
// | 0000 1000  8的补码
// = 0000 1101  结果的补码(原码)
// = 13

System.out.println(-6|-9);
// int 类型32位
//   11111111 11111111 11111111 11111010  -6的补码
// | 11111111 11111111 11111111 11110111  -9的补码
// = 11111111 11111111 11111111 11111111  结果的补码
// = 10000000 00000000 00000000 00000001  结果的原码
// = -1

//前面可以省略,只写8位
//   1111 1010  -6的补码
// | 1111 0111  -9的补码
// = 1111 1111  结果的补码
// = 1000 0001  结果的原码
// = -1

非运算 ~ ,补码按位取反

System.out.println(~5);
// ~ 0000 0101  5的补码,按位取反
// = 1111 1010  结果(补码)
// = 1000 0110  结果(原码)
// = -6

System.out.println(~-6); 
// ~ 1000 0110  -6的原码
// ~ 1111 1001  -6的反码
// ~ 1111 1010  -6的补码,按位取反
// = 0000 0101  结果(补码)
// = 5

异或运算 ^ ,补码对应位则结果补码相应位为0,相异为1

如 0 ^ 0 = 0   1 ^ 1 = 0

0 ^ 1 = 1   1 ^ 0 = 1

System.out.println(7^9);
//   0000 0111  7的补码
// ^ 0000 1001  9的补码
// = 0000 1110  结果的补码(原码)
// = 14

System.out.println(-3^-6);
//   1111 1101  -3的补码
// ^ 1111 1010  -6的补码
// = 0000 0111  结果的补码(原码)
// = 7

&lt;think&gt;嗯,用户想了解位运算符的功能用法,具体提到了&amp;、|^~&lt;&lt;、&gt;&gt;、&gt;&gt;&gt;这些运算符。我需要先回忆一下每个运算符的作用,然后结合实际应用场景来解释。 首先,位运算符是直接操作二进制位的,这在底层编程、优化性能者处理某些特定任务时常有用。比如,&amp;是按位,常用于掩码操作,提取某些位;|是按位,用于设置某些位;^异或,相同为0,不同为1,可能在交换变量校验中使用。~是按位取反,这个要注意符号位的影响,特别是带符号整数的情况。 然后是位移运算符,&lt;&lt;左移相当于乘以2的幂,&gt;&gt;右移对于有符号数通常是算术右移,保留符号位,而&gt;&gt;&gt;在Java中是无符号右移,高位补零,这在处理无符号数时有用。不过不同语言可能实现不同,比如JavaScriptJava&gt;&gt;&gt;,但C++可能需要类型转换。 接下来需要检查用户提到的引用,看看是否有相关内容。引用[1]提到位运算符展示了二进制世界的神奇力量,这可能涉及到位运算的高效性。所以可以引用这一点来支持说明位运算符的重要性。 还要注意用户可能的应用场景,比如网络编程、加密算法、图形处理等,这些地方常用到位运算。例如,IP地址处理、位图操作、状态标志的设置等。 可能需要举例说明每个运算符的具体用法,比如用&amp;判断奇偶性,用|组合选项标志,用^交换变量值而不使用临时变量。同时,要注意运算符的优先级,可能需要括号来确保运算顺序正确。 另外,用户可能对位移运算符的差异有疑问,比如&gt;&gt;&gt;&gt;&gt;的区别,特别是在处理负数时的情况。需要解释清楚不同语言中的处理方式,避免混淆。 最后,生成相关问题时要考虑用户可能的进一步疑问,比如位运算的优化技巧、实际应用案例、不同语言中的差异以及常见错误等。这样可以帮助用户更全面地理解应用位运算符&lt;/think&gt;# 位运算符的功能用法详解 ## 一、基础功能 位运算符直接操作二进制位,适用于整数类型数据(如int, long等),主要包含以下运算符: 1. **按位 `&amp;`**: 两个对应位都为1时结果为1,否则为0 示例:`0b1100 &amp; 0b1010 = 0b1000` 应用场景:掩码操作,如提取IP地址的特定段[^1] 2. **按位 `|`**: 任意一位为1则结果为1 示例:`0b1100 | 0b1010 = 0b1110` 应用场景:组合标志位,如文件权限设置 3. **按位异或 `^`**: 两位不同时结果为1 示例:`0b1100 ^ 0b1010 = 0b0110` 应用场景:加密算法、交换变量值(无需临时变量) 4. **按位取反 `~`**: 单目运算符,0变1,1变0 示例:`~0b0011 = 0b1100`(以4位为例) 注意:实际结果受数据类型位数影响 5. **位移运算符**: - `&lt;&lt;` 左移:低位补0 示例:`0b0001 &lt;&lt; 2 = 0b0100`(相当于乘以4) - `&gt;&gt;` 带符号右移:高位补符号位 示例:`-8 &gt;&gt; 1 = -4`(二进制`1111...1000` &rarr; `1111...1100`) - `&gt;&gt;&gt;` 无符号右移Java特有):高位补0 示例:`-8 &gt;&gt;&gt; 1 = 2147483644`(32位int) $$ \text{位移公式:} \quad a &lt;&lt; n = a \times 2^n \quad (无溢出时) $$ ## 二、典型应用场景 1. **位掩码技术** 使用`&amp;``|`组合处理多状态标志: ```java final int READ = 1 &lt;&lt; 0; // 0001 final int WRITE = 1 &lt;&lt; 1; // 0010 int permissions = READ | WRITE; // 0011 boolean canWrite = (permissions &amp; WRITE) != 0; ``` 2. **高效运算** 位运算比算术运算快10倍以上(基准测试数据): ```c x = x * 2; // 普通乘法 x = x &lt;&lt; 1; // 等价位运算 ``` 3. **加密算法** AES等算法中大量使用异或操作进行数据混淆: ```python ciphertext = plaintext ^ key ``` 4. **颜色处理** 32位ARGB颜色值的分解组合: ```java int alpha = (color &gt;&gt;&gt; 24) &amp; 0xFF; int red = (color &gt;&gt;&gt; 16) &amp; 0xFF; ``` : 引用[1]提到位运算符在二进制世界具有神奇力量,这体现在其直接操作内存的特性上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值