~ 按位非(NOT) b = ~a
& 按位与(AND) c = a & b
| 按位或(OR) c = a | b
^ 按位异或(XOR) c = a ^ b
>> 右移 b = a >> 2
>>> 右移,左边空出的位以0填充 b = a >>> 2
<< 左移 b = a << 1
当然同样有 &=,|=,^=,>>=,>>>=,<<=。
有关这些 *** 作的细节可以参看
>我们知道,在java中,int是占4个字节的,也就是32位。
这个程序,应该是为了将一个int类型转换成32位2进制数。
原理:
1 <<:左移运算符,在没有数字溢出的情况下,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
2 &:位运算符,当两边 *** 作数的位同时为1时,结果为1,否则为0。如111 & 101 = 101。
切入正题:
1 为了取得32位完整的二进制数,需要循环32次,1<<31即2的31次方,表示最高位为1,其余31位均为0的二进制数;1<<30即2的30次方,表示第二位为1,其余31位均为0的二进制数;以此类推。
2 程序从高位开始转换int类型,我们想要截取二进制数的特定某位时,我们需要用一个此位为1,其余位均为0的二进制数来做&运算,例如,我们想截取15的最高位,我们只需使用最高位为1的32位二进制数与15做&运算即可。因为假设假设某位为1,1 & 1 = 1,假设某位为0,0 & 1 = 0,均能得到原来的数。而1或0与0相与均为0
总之,程序是从高位到低位依次一位一位截取int对应二进制数,输出的结果便是int对应的二进制数; 移位运算符就是在二进制的基础上对数字进行平移 我们知道 Java中byte short和char类型在进行计算时都是先将其转换为int类型 同样在进行移位运算时也不例外 它们移位后的结果也都会变成int类型 由于int类型为 位的( ) 所以对于byte short char和int进行移位时 规定实际移动的次数最多是 位 如果超过 则按n = n % 来计算 也就是说移位 次和移位 次得到的结果相同 移动long型的数值时(long是 位的) 规定实际移动的次数是移动次数和 的余数 也就是移动 次和移动 次得到的结果相同 您可以亲自动手做下试验 现在我们介绍Java中的三种位移运算符 )《(左移) 运算规则 按二进制形式把所有的数字向左移动对应的位数 高位移出(舍弃) 低位的空位补零 语法格式 需要移位的数字 《 移位的次数 例如 《 则是将数字 左移 位 计算过程 《 首先把 转换为二进制数字(int类型的话为 位 字节 long的话为 位 字节) 然后把该数字高位(左侧)的两个零移出 其他的数字都朝左平移 位 最后在低位(右侧)的两个空位补零 则得到的最终结果是 则转换为十进制是 数学意义 在数字没有溢出的前提下 对于正数和负数 左移一位都相当于乘以 的 次方 左移n位就相当于乘以 的n次方 比如 《 = )》(带符号右移) 运算规则 按二进制形式把所有的数字向右移动对应位数 低位移出(舍弃) 高位的空位补符号位 即正数补 负数补 语法格式 需要移位的数字 》 移位的次数 例如 》 则是将数字 右移 位 计算过程 的二进制形式为 然后把低位的最后两个数字移出 因为该数字是正数 所以在高位补零 则得到的最终结果是 转换为十进制是 数学意义 右移一位相当于除 右移n位相当于除以 的n次方 )>>>(无符号右移) 运算规则 按二进制形式把所有的数字向右移动对应位数 低位移出(舍弃) 高位的空位补零 其他结构和》相似 位移运算通常用来对代码进行速度上的优化 用它来代替乘除法将是很好的选择 下面来举几个例子 希望对大家使用位移运算符有所帮助 用位移运算符来实现 i / = + + 所以对i / 可以这样来表示 ( i 《 ) + ( i 《 ) + ( i 《 ) 写出( q 《 ) + ( q 《 )实现的代码 原式 = q ^ + q ^ = q ( + ) = q lishixinzhi/Article/program/Java/hx/201311/26978
乘以或除以2^n的运算。
比如2<<1,就是把00000010变成了00000100,2变成了4,相当于乘了2;
60>>2,就是把00111100变成了00001111,60变成了15,相当于除以4。
8>>>1,8的二进制是00001000,符号位即最高位是0,所以用0填充,00001000变成00000001,得到1,相当于除以8。
以上都是对正数的 *** 作,下面来看对负数的 *** 作:
-12<<1,-12的补码是11110100,左移1位,变成11101000,正好是-24的补码,相当于乘以2。
-36>>2,-36的补码是11011100,右移2位,变成00110111,这是55的二进制码,与-36好像没什么关系。
-40>>>3,-40的补码是11011000,符号位即最高位为1,所以用1填充左侧的位,得到11111011,这是-5的补码,相当于除以8。
由上面的例子可见,>>>其实是为了方便实现负数整除2^n的运算。
另外,站长团上有产品团购,便宜有保证
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)