您的位置:首页 > 职场人生

java面试准备-day03

2016-08-12 18:09 295 查看
二十一、 (x&y) + ( (x^y)>>1 )=(x+y)/2证明

关于二进制的所有证明,今天得到了很好的理解。对于任何一个数,首先,我们要把所有的数想成1和0之间的运算,而不是11110000和10100101之间的运算,这样才能找到规律(可能不适用于其他的运算,暂时未发现)。

java中的二进制运算包括与&、或|、非~、异或^四种,以及几种位移运算;这里我们把所有的整数数都拆开来看:m=a0+a1*10+a2*10^2+a3*10^3+a4*10^4+。。。。这样就是所有的对二进制进行运算,再次,我们考虑一种情况,即这种运算之中不夹杂加减乘除,或者说是加减乘除不影响位运算结果的情况,这样,我们就可以,把所有的位运算看做成1和0之间的运算,具体的例子如下:

对于这个证明:

由于1&1=1,0&0=0,1&0=0;——100

再者1^1=0,0^0=0,1^0=1; ——001

这里面注意到&运算相当于对数字相同的进行了减半:即/2(本身两个数就是一样的);

^运算相当于对数字不同的进行了相加;

所以左边的

=(x中和y相同的部分+(x和y不同的部分的和)/2)

=((x&y)+(x^y)>>1)

二十二、Java中的一些位运算法则

判断int型变量a是奇数还是偶数

a&1 = 0 偶数

a&1 = 1 奇数

求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。

(x&y)+((x^y)>>1);

对于一个大于0的整数,判断它是不是2的几次方

((x&(x-1))==0)&&(x!=0);

比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效

x ^= y;

y ^= x;

x ^= y;

求绝对值

int abs( int x )

{

int y ;

y = x >> 31 ;

return (x^y)-y ; //or: (x+y)^y

}

取模运算,采用位运算实现:

a % (2^n) 等价于 a & (2^n - 1)

乘法运算 采用位运算实现

a * (2^n) 等价于 a << n

除法运算转化成位运算

a / (2^n) 等价于 a>> n

求相反数

(~x+1)

10 a % 2 等价于 a & 1

当一个人找不到出路的时候,最好的办法就是将当前能做好的事情做到极致,做到无人能及。

二十三、并行和并发区别

并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑;

并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: