位运算应该知道的一些基础知识

 

掌握位运算对了解计算机本身具有很大的帮助,这需要长时间不断地用二进制思维来“模拟”计算机的运算过程^-^才能熟练,建议大家对于1111=15(10)=FF(16)=17(8)以内的所有二进制表示都要牢记在心。下面本人介绍在位运算方面应该知道的一些常用方法,很希望大家能把关于位运算的一些技巧共享出来:)

AND运算:

      AND一般都是用来做清“零”操作,因为一些特殊的需求可能会用到这样的循环,1,2,3,4,5,6,7.....15,0。注意是从1开始然后到0结束,这类应用最早我实在一个画图程序中看到的代码,画了一个矩形,然后程序自动分配16个点,所以就看到了类似下面的代码。

       for (int i = 1; i <= 16; i++){
            System.out.println(i & 15);
       }

      当然了你只要用最后一个数进行AND运算都是回归到0。
      如果我想获得它的前4位:
      0101 1111
      AND
      1111 0000
     =0101 0000

      同理,后四位:
      0101 1001
      AND
      0000 1111
     =0000 1001

      还有时会用AND运算来判断一个数是奇数还是偶数,很简单只要跟1比较就可以了。

     for(int i = 0;i < 100; i++){
         if((i & 1) == 0)
              System.out.println("偶数:" + i);
     }

 

OR运算:
      任何数跟“0”运算或者跟自己运算都是自己。
      其主要用来将位的值置为“1”,例如将后四位置为1。
      1000 1001
      OR
      0000 1111
     =1000 1111
      同理将前四位置为“1”
      0001 1001
      OR
      1111 0000
     =1111 1001

 

XOR运算:
      最早知道XOR运算的时候,不知道是那个公司出的面试题,说交换A,B两个值不使用第三者变量。当时是一头雾水不知如何下手,其实XOR用起来很简单:
      A = A ^ B
      B = B ^ A
      A = A ^ B

      任何两个相等的值XOR运算后都等于零,上面的等式拆开来就是:
      B = B ^ (A ^ B)    B被清掉
      A = (A ^ B) (B ^ A ^ B)    剩下个B
      如果等号两边同时具有相同的数,就不用去拆开了:
      B = B ^ (A ^ B)
      A = A ^ (B ^ A)

 

NOT运算:
      如果想得到这个数的负数很简单,NOT运算后再OR1即可,当然这种方式不安全,因为无符号和有符号并不是等长的,超边界的时候会出现问题。
      ~25 = -26
      ~25 | 1 = -25

 

<<运算:

     就是乘2的N次方运算:

      3 << 2 = 3 * 2^2 = 12

     -3 << 2 = -3 * 2^2 = -12

 

>>运算:

     除2的N次方运算:

     16 >> 2 = 16 / 2^2 = 4

     -16 >> 2 = -16 / 2^2 = -4

 

如果不同长度的两个数据进行运算,系统自动将两者的长度对其,高端为补"零",有符号的数符号位始终为"1"。

 

 各位还有什么经验,可以一起来信分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值