![](/upload/rand_pic/2-961.jpg)
2 3 结果为 16,实际就是 2 的 (3+1) 次方,2 0 结果为 2,即 2 的 1 次方
Byte 转 M:10 * 1024 * 1024 = 10 M,使用左位移实现:10 20
基本概念:
以下对于有符号的数据而言:(java的数据全是有符号的,C语言才有无符号数据)
1、正数的原码,反码,补码都一样。
2、负数的反码 = 它的原码符号位不变,其他位取反
3、负数的补码 = 它的反码+1
4、0的反码,补码都是0
5、在计算机运算时,都是以补码的方式运算的
位运算就是照上面把数据转成二进制以bit存放后来运算。
注意:按位取反连符号位也要取反。按位取反运算符是 这个符号 lsquo; ~ rsquo; (在数字1的隔壁)
注意:位运算是以补码方式运算的,结果也是补码,如果发现补码是负数,那就要转换成原码。
位移运算:
算数右移:比如int型是4个字节就是32bit,把这32bit的内存看作或者站台,刚好一辆32个车厢的火车正好对位停在这。算数右移动就是就以最低位那个作为火车头,向右移几位就是火车向右开几个车厢。向右边开走了5个车厢的话那么左边站台就空出5个车厢的位置了,那么就复制符号位来填满这5个位置。(符号位是1就填充了5个1,是0就填了5个0咯)
算数左移:这个简单,符号位是不变的,火车往做开,空出的位置全部用0补上。 (这就相当于每左移一位就相当于乘以了个2,如1 2 = 1 x 2 x 2 = 4 . 负数一样 -1 2 就等于-4,因为移动时符号位不变 ),这样就有个有有意思面试题:请将一个数以最快的执行效率让他变成他的两倍。 让一个数比如说100变成两倍不就是 100 * 2 不就等于200了 吗? 是。 但是还可以: 100 1 也等于200, 用*运算符是没有位运算符快的,位运算符直接操作内存那个叫快啊,比*好快多多了! 同样想得到100的8次方是多少就是 2左移多少位等于100
逻辑右移:这个其实就算是算数左移动反方向,同样是补0 , 就是算数左移在倒车。
来做几个例:
3 1//3是二进制11,因为是证书,一看就出来了结果是13 2//移动2位就是0了,只要移2为以上都是0