码迷,mamicode.com
首页 > 其他好文 > 详细

位运算应用

时间:2016-12-24 02:06:30      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:启动   nbsp   system   toc   stat   log   ++   array   目标   

有时需要追求效率,会代替一些算术运算。

  • 求商:a >> n  <=>  a / 2^n
  • 求积:a << n  <=>  a * 2^n
  • 求余:a & ((1 << n) - 1)  <=>  a % 2^n
  • 奇偶判断:a & 1 == 1  <==>  a % 2 == 1

 

一般1表示选中或者启动项,0表示未选或者关闭项。

  • 获取全部项:(1 << n) - 1
  • 获取第n项:1<<(n-1)
  • 获取反选项:~a
  • 启动目标项:a |= b
  • 合并两选项:a | b
  • 关闭目标项:a &= ~b
  • 查看公共项:a & b
  • 查看改变项:a1 ^ a2
  • 查看未变项:~(a1 ^ a2) = ~a1 ^ a2 = a1 ^ ~a2

 

输出组合,如下示例,输出abcd的组合。

public static void main(String[] args) {
    char[] chars = "abcd".toCharArray();
    int len = chars.length;
    
    int bits = (1 << len) - 1;
    for (int i = bits; i > 0 ; i = (i - 1) & bits) {
        System.out.printf("%" + len + "s:", Integer.toBinaryString(i));
        for(int j = 0; j < len; j++) {
            if(((i >> j) & 1) == 1)
                System.out.print(chars[j]);
        }
        System.out.println();
    }
}

输出结果:

1111:abcd
1110:bcd
1101:acd
1100:cd
1011:abd
1010:bd
1001:ad
1000:d
 111:abc
 110:bc
 101:ac
 100:c
  11:ab
  10:b
   1:a

 

>>与>>>的区别:

  • >>是带符号右移,即正数时左边补0,负数时左边补1。
  • >>>是无符号右移,即总是左边补0。

位运算应用

标签:启动   nbsp   system   toc   stat   log   ++   array   目标   

原文地址:http://www.cnblogs.com/hvicen/p/6216488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!