了解一点位运算


严格来说,在团队程序开发里位运算是一个噩梦般的存在。毕竟不是每个人对这种奇特的运算感兴趣,但是总有程序员为了性能等各方面的考虑(特别是在大数据的处理方面)从而选择采用位运算。虽然位运算的写法相对晦涩难懂,但其性能提升明显也深受喜爱,故掌握和了解一点常见的位运算,为可能潜在的程序阅读和效率提升做些铺垫。

位运算基础


& 按位与:两个位都为 1 时,结果才为 1,否则返回0。

| 按位或:两个位都是 0 时,结果才为 0,否则返回1。

^ 按位异或:两个位相同时为 0,相异为 1。

~ 位取反:0 变 1,1 变 0。

<< 左移:各二进位全部左移若干位,高位丢弃,低位补 0。

>> 右移:将运算符左边的对象向右移动运算符右边指定的位数。不同编译器处理不尽相同,Java使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1。

应用


1、乘除2

左移运算等价于乘2,右移运算等价于除以2,其运算效率高于乘除法运算。

示例程序:

int a=100;
System.out.println(a<<1 a="" system.out.println="">>1); //表示除以2
System.out.println(a<<2 a="" system.out.println="">>2); //表示除以4


运行结果:
200
50
400
25

2、判断奇偶数

我们通常采用偶数的数学定义(%2)来判断,由二进制原理知,二进制最后一位为0,则其转化为十进制后为偶数,若为1则十进制数为奇数,我们可以通过这个特点,与1进行按位与运算的结果判断是否为偶数。

参考实现:(本程序从键盘读入数字并进行判断)

    Scanner read;
    read = new Scanner(System.in);

    int a;
    a = read.nextInt();

    if ((a & 1) == 1) {
        System.out.println(a + "是一个奇数。");
    } else {
        System.out.println(a + "是一个偶数。");
    }




3、异或实现两个数字的交换。

先补充异或运算的两个性质,a^a=0;a^0=a。

未完待续……

没有评论:

感谢每一条善意的建言和理性的讨论!

特殊时期开启审核制度敬请谅解。
挑衅和引战会被删除并永久拉黑。

Blogger 提供支持.