java基础之位运算符

java提供的位运算符有:
第一部分:  &(位与),|(位或),^(位异或),~(位非) 
第二部分:  >>(右移),>>>(无符号右移),<<(左移)
其中除~为一元操作符,其他的都是二元操作符。  
 根据运算模式不同分为两部分
一.第一部分
&,|,^,~ 的运算规则
* &:有0则0
* |:有1则1
* ^:相同则0,不同则1
* ~:按位取反
案例:
    
    
  1. class Demo1_Operator {
  2. public static void main(String[] args) {
  3. /*
  4. * &,|,^,~ 的用法
  5. * &:有0则0
  6. * |:有1则1
  7. * ^:相同则0,不同则1
  8. * ~:按位取反
  9. */
  10. System.out.println(6 & 3); //2
  11. System.out.println(6 | 3); //7
  12. System.out.println(6 ^ 3); //5
  13. System.out.println(~6); //-7
  14. }
  15. }

上述代码是如何运算过程是什么?
a.  6 & 3 的二进制位运算过程: 有0则0
   110
& 011
-----------
    010

b.  6 | 3 的二进制位运算过程:有1则1
       110
   |    011
-------------
       111
c.  6 ^ 3 的二进制位运算过程:相同则0,不同则1
      110
^     011
-------------
      101

d.  6 ^ 3 的二进制位运算过程:按位取反
  00000000 00000000 00000000 00000110    //6的原码反码补码都是本身
  11111111 11111111 11111111 11111001    // 对6取反得补码
- 00000000 00000000 00000000 00000001    //减1求反码
-----------------------------------------------------------
11111111 11111111 11111111 11111000      //反码,对反码进行除符号位以外其他位上按位取反。
10000000 00000000 00000000 00000111      //求得原码(-7)

位运算之面试题
核心要点:^的特点:一个数据对另一个数据位异或两次,该数本身不变。
题目:请自己实现两个整数变量的交换(不需要定义第三方变量)
案例:
     
     
  1. class Demo2_Operator {
  2. public static void main(String[] args) {
  3. /*
  4. * 位异或运算符的特点
  5. * ^的特点:一个数据对另一个数据位异或两次,该数本身不变。
  6. */
  7. int x = 10;
  8. int y = 5;
  9. //需要第三方变量
  10. /*
  11. int temp;
  12. temp = x; //temp = 10
  13. x = y; //x = 5
  14. y = temp; //y = 10
  15. */
  16. //不需要定义第三方变量,有弊端,有可能会超出int的取值范围
  17. /*
  18. x = x + y; //10 + 5 = 15
  19. y = x - y; //15 - 5 = 10
  20. x = x - y; //15 - 10 = 5
  21. */
  22. //不需要第三方变量,通过^来做
  23. x = x ^ y; // 10 ^ 5 
  24. y = x ^ y; // 10 ^ 5 ^ 5 y = 10
  25. x = x ^ y; // 10 ^ 5 ^ 10  x = 5
  26. System.out.println("x = " + x + ",y = " +y);
  27. }
  28. }


二.第二部分
 >>,>>>,<<的基本运算规则:     a  位移运算符   b  (a表示要进行位移的数,b表示位移的位数)   
1.  <<:左移 左边最高位丢弃,右边补齐0
2.  >>:右移 最高位是0,左边补齐0;最高位是1,左边补齐1
3.  >>>:无符号右移 无论最高位是0还是1,左边补齐0(正数适合,负数不适合,负数右移会变成正数)
4.  最有效率的算出2 * 8的结果
案例:
   
   
  1. class Demo3_Operator {
  2. public static void main(String[] args) {
  3. /*
  4. *  <<:左移 左边最高位丢弃,右边补齐0
  5. *  >>:右移 最高位是0,左边补齐0;最高为是1,左边补齐1
  6. *  >>>:无符号右移 无论最高位是0还是1,左边补齐0
  7. *  最有效率的算出2 * 8的结果
  8. */
  9. //左移,向左移动几位就是乘以2的几次幂
  10. //System.out.println(12 << 1); //24
  11. //System.out.println(12 << 2); //48
  12. /*
  13. 00000000 00000000 00000000 00001100 12的补码
  14. (0)0000000 00000000 00000000 000011000 24的补码
  15. (00)000000 00000000 00000000 0000110000 48的补码
  16. */
  17. //System.out.println(-12 << 1); //-24
  18. //System.out.println(-12 << 2); //-48
  19. /*
  20. 10000000 00000000 00000000 00001100 -12的原码
  21. 11111111 11111111 11111111 11110011 -12的反码
  22. 11111111 11111111 11111111 11110100 -12的补码
  23.         (1)11111111 11111111 11111111 11101000 -24的补码
  24. 11111111 11111111 11111111 11100111 -24的反码
  25. 10000000 00000000 00000000 00011000 -24的原码
  26. */
  27. //右移,向右移动几位就是除以2的几次幂
  28. //System.out.println(12 >> 1); //结果为 6
  29.             //System.out.println(-12 >> 1); //结果为 -6
  30. /*
  31. 00000000 00000000 00000000 00001100 12的补码
  32. 00000000 00000000 00000000 00000110 6的补码
  33.                
  34. 10000000 00000000 00000000 00001100 -12的原码
  35. 11111111 11111111 11111111 11110011 -12的反码
  36. 11111111 11111111 11111111 11110100 -12的补码
  37.         11111111 11111111 11111111 11111010(0) -6的补码
  38. 11111111 11111111 11111111 11111001 -6的反码
  39. 10000000 00000000 00000000 00000110 -6的原码
  40. */
  41.                
  42.             //System.out.println(12 >>> 1); //运算规则与>>一样 结果为6,在这里不做位运算详解了
  43.             //System.out.println(-12 >>> 1); // 右移,最高位补0 结果2147483644
  44. /*
  45.  
  46. 10000000 00000000 00000000 00001100 -12的原码
  47. 11111111 11111111 11111111 11110011 -12的反码
  48. 11111111 11111111 11111111 11110100 -12的补码
  49. 01111111 11111111 11111111 11111010(0) 2147483644的补码
  50.                       01111111 11111111 11111111 11111010 2147483644的原码
  51.             */
  52. //最有效率的算出2 * 8的结果 ,位运算的效率是比运算符的效率要高的.
  53. System.out.println(2 << 3);
  54. }
  55. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欢谷悠扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值