位运算

来源:互联网 发布:马云放弃淘宝c店 编辑:程序博客网 时间:2024/06/06 08:26

位运算在很多时候可以提高效率,小小的一行也能成为程序的亮点,今天简单介绍一下位运算以及一些小技巧,希望以后我可以想着用一下

一、逻辑运算

1.逻辑&,就是将两个数的二进制按位进行&(同1则1),如果有负数,则按照补码进行运算

应用:

(1) 清零 清零:将其全部的二进制位全部置为0。例如整型数a=321对其全部数据清零的操作为a=a&0x00 321=0000 0001 0100 0001 &0=0000 0000 0000 0000

= 0000 0000 0000 0000

(2) 获取一个数据的指定位 

获取一个数据的指定位。例如获得整型数a=的低八位数据的操作为a=a&0xFF321=

0000 0001 0100 0001 & 0xFF =0000 0000 1111 11111

= 0000 0000 0100 0001

获得整型数a=的高八位数据的操作为a=a&0xFF00==a&0XFF00==

321=0000 0001 0100 0001 & 0XFF00=1111 1111 0000 0000

= 0000 0001 0000 0000

2、逻辑|,就是将两个数的二进制按位进行|(有1则1),如果有负数,则按照补码进行运算

应用:

设定一个数据的指定位。例如整型数a=321,将其低八位数据置为1的操作为a=a|0XFF321= 0000 0001 0100 0001 | 0000 0000 1111 1111=0000 0000 1111 1111

3.逻辑异或

就是将两个数的二进制按位进行(相同为0不同为1)

用途:

 (1)定位翻转 

定位翻转:设定一个数据的指定位,将1换为00换为1。例如整型数a=321,,将其低八位数据进行翻位的操作为a=a^0XFF;

(2)数值交换 

数值交换。例如a=3,b=4。在例11-1中,无须引入第三个变量,利用位运算即可实现数据交换。以下的操作可以实现a,b两个数据的交换:

a=a^b;

b=b^a;

a=a^b;

4、逻辑~

将数的二进制按位取反

二、位移运算

 位左移即乘以2,右移即除以二

下面贴一下常用的技巧:

1.判断奇偶

boolean isOddNumber(int n){      return (n & 1) == 1;  }


2.判断符号是否相同

boolean isSameSign(int x, int y){ //有0的情况例外      return (x ^ y) >= 0; // true 表示 x和y有相同的符号, false表示x,y有相反的符号。  } 


3.计算2的n-1次幂

int getFactorialofTwo(int n){//n > 0      return 2 << (n-1);//2的n次方  }  

4.判断一个数是不是2 的幂

boolean isFactorialofTwo(int n){      return n > 0 ? (n & (n - 1)) == 0 : false;      /*如果是2的幂,n一定是100... n-1就是1111....        所以做与运算结果为0*/  }  

5.从低位到高位,将n的第m位置1

int setBitToOne(int n, int m){      return n | (1 << (m-1));      /*将1左移m-1位找到第m位,得到000...1...000       n在和这个数做或运算*/  }

6.从低位到高位,将n的第m位置0

int setBitToZero(int n, int m){      return n & ~(1 << (m-1));      /* 将1左移m-1位找到第m位,取反后变成111...0...1111        n再和这个数做与运算*/  }  


欢迎补充!!


原创粉丝点击