单位换算:
(1.)bit:位
一个二进制数据0或1,是1bit;
(2.)byte:字节
1 byte = 8 bit , 存储空间的基本计量单
一个英文字符占一个字节;
(3.)1 字母 = 1 byte = 8 bit
一个汉字占2个字节;
1 汉字 = 2 byte = 16 bit
常见的位运算符有:
&(与)、|(或)、^(异或)、~(取反)、<<(左移)、>>(右移)、>>>(无符号右移)。
关于位运算符参考文章:
Java 位运算符 &、|、^、~、<<、>>、>>>
Java位运算原理及使用讲解
位运算符对二进制数据进行处理,加减乘除适用于十进制,而位运算就是二进制的运算。
一.用&判断一个数是奇数还是偶数:
n&1为1则是奇数,为0则是偶数
n&1 == 1?”奇数”:”偶数”
二.用 << 计算乘法m*2^n。左移运算符相当于乘2,即每左移一位,则变为原来的2倍
如(1): 12 << 1 的意思就是12向左移动一位
12的二进制是: 00001100
左移一位后二进制是:00011000,转化为十进制是24
同理,12 << 3的意思就是12向左移动三位,即12 *2 *2 *2。
三.用 >> 计算除法,这个跟左移运算大体是一样。右移运算符相当于除2,即每右移一位,则变一半。
12 >>1即12/2
12的二进制是: 00001100
右移一位后二进制是:00000110,转化为十进制是6
注意:当被除数为奇数时会取整。
13>>1即13/2,右移后13的二进制最后一位1被移出,所以结果是6
13的二进制是: 00001101
右移一位后二进制是:00000110,转化为十进制是6
四、使用^来进行两个数的交换,不需要用到临时变量。
int x = 1234;
int y = 7951;
x ^= y;
y ^= x;
x ^= y;
五、使用~取相反数
int x = 1234;
int y = ~x+1;
六、求平均数
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
int average(int x, int y) {
return (x&y)+((x^y)>>1);
}
七、求绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //或者: (x+y)^y
}