位运算

位运算针对的是二进制,所以需要将进行位运算的数现转成在内存中二进制的表示形式

 

左移或右移

例如: 3 << 2 = 12

内存中二进制(32位):   0000 0000 0000 0000 0000 0000 0000 0011
左移后的结果为(32位):   0000 0000 0000 0000 0000 0000 0000 1100

原理就是:

   左移就是从左边开始去掉几位,就在最后面添加0,补成32位

   右移同理,在前面补0还是1要看最高位(最左边)是0还是1。

计算方法: 左移:往左移几位就乘以2的几次幂  (就是乘以2的移动位数次幂)

                             3 << 2 等价 3 * 2的2次幂   3 << 3 等价 3 * 2的3次幂

                  右移: 同理往右移几位就除以2的几次幂  (除以2的移动的位数次幂)

>> : 有符号的右移  

>>>: 无符号右移无论最高位是什么,右移后,前面都补0

 

&运算:   1 & 1 = 1 、1 & 0 = 0、0 & 0 = 0 由此可以进行&运算

例如:

  6 & 3 = 2

               0000 0000 0000 0000 0000 0000 0000 0110
           &   0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------------------------
               0000 0000 0000 0000 0000 0000 0000 0010

 

|  运算 : 1 | 1 = 1 、1 | 0 = 1、0 | 0 = 0 由此可以进行 | 运算

例如:

  6 | 3 = 7

          0000 0000 0000 0000 0000 0000 0000 0110
        | 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------------------------
          0000 0000 0000 0000 0000 0000 0000 0111

 

^ 异或 :  相同为false , 不同为true     

(ps: 一个数异或同一个数两次,结果还是那个数,可以用在数据加密上)

例如:

 6 ^ 3 = 5

          0000 0000 0000 0000 0000 0000 0000 0110
        ^ 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------------------------
          0000 0000 0000 0000 0000 0000 0000 0101

 

~ 取反:  0和1互换,得到的结果减一再取反就得到十进制的数,然后加上负号就是结果

例如:

~6 = - 7

               0000 0000 0000 0000 0000 0000 0000 0110
取反          1111 1111 1111 1111 1111 1111 1111 1001
减一          0000 0000 0000 0000 0000 0000 0000 0001
结果          1111 1111 1111 1111 1111 1111 1111 1001
取反          0000 0000 0000 0000 0000 0000 0000 0110   = 7
加上负号最终结果是 -7

一个负数的等价于对应的正数取反加一

-6 = ~6 + 1

 

小技巧:不使用第三个变量交换两个数

int n = 3, m = 5;
//使用加法
n = n + m; //n = 8
m = n - m; //8 - 5 = 3  m = 3
n = n - m; //8 - 3 = 5  n = 5

//使用异或
n = n ^ m; 
m = n ^ m; // (n^m)^m 结果是n 此时m是n
n = n ^ m; //( n ^ m)^ n 结果是 m 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值