一个数在计算机中的二进制表示形式,就是这个数的机器数。
二进制显示
高位存放符号,正数是0,负数是1
两个位都为1则为1,否则为0
printFormat(101);printFormat(-101);printFormat(101&101);结果:0000 0000 0000 0000 0000 0000 0110 01011111 1111 1111 1111 1111 1111 1001 10110000 0000 0000 0000 0000 0000 0110 0101
同一个数&运算后还是本身
两个位只要有一个为1,那么结果就是1,否则就为0
printFormat(101);printFormat(101|101);结果:0000 0000 0000 0000 0000 0000 0110 01010000 0000 0000 0000 0000 0000 0110 0101
同一个数|运算后还是本身
位为0,结果是1,位为1,结果是0
printFormat(101);printFormat(~101);结果:0000 0000 0000 0000 0000 0000 0110 01011111 1111 1111 1111 1111 1111 1001 1010
两个位相同则结果为0,否则结果为1
printFormat(101);printFormat(32);printFormat(101^32);结果:0000 0000 0000 0000 0000 0000 0110 01010000 0000 0000 0000 0000 0000 0010 00000000 0000 0000 0000 0000 0000 0100 0101
左移运算符 << ,num << 1,相当于num乘以2
示例:101printFormat(101);printFormat(101<<1);结果:左移前:0000 0000 0000 0000 0000 0000 0110 0101左移后: 0000 0000 0000 0000 0000 0000 1100 1010示例:-101printFormat(-101);printFormat(-101<<1);结果:左移前:1111 1111 1111 1111 1111 1111 1001 1011左移后: 1111 1111 1111 1111 1111 1111 0011 0110
正数左移,二进制左边移除1位,右边补0
负数左移,二进制左边移除1位,右边补0
右移运算符 >> ,num >> 1,相当于num除以
示例:101printFormat(101);printFormat(101>>1);结果:右移前: 0000 0000 0000 0000 0000 0000 0110 0101右移后: 0000 0000 0000 0000 0000 0000 0011 0010示例:-101结果:右移前: 1111 1111 1111 1111 1111 1111 1001 1011右移后: 1111 1111 1111 1111 1111 1111 1100 1101
正数右移,二进制右边移除1位,左边补0
负数右移,二进制右边移除1位,左边补1
无符号右移 >>>,忽略符号位,空位都以0补齐
无符号右移运算符和右移运算符是一样的,不过无符号右移运算符在右移的时候是补0的,而右移运算符是补符号位的
表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
printFormat(101);>>1);printFormat(-101);>>1);结果:右移前: 0000 0000 0000 0000 0000 0000 0110 0101右移后: 0000 0000 0000 0000 0000 0000 0011 0010右移前: 1111 1111 1111 1111 1111 1111 1001 1011右移后: 0111 1111 1111 1111 1111 1111 1100 1101
正负数右移,左边补0
测试代码如下:
public class TestBase {protected void printFormat(int n){out(format(n));}protected void printFormat(long n){out(format(n));}protected void out(Object obj){System.out.println(obj);}protected void err(Object obj){System.err.println(obj);}protected String format(long n){return format(toBinaryString(n),64);}private String format(String str,int len){if (len > str.length()){str = String.format("%0"+(len - str.length())+"d",0)+str;}int i = 1;StringBuilder sb = new StringBuilder();for (char c:str.toCharArray()) {sb.append(c);if (i == 4){sb.append(" ");i = 0;}i++;}return sb.toString();}protected String format(int n){return format(toBinaryString(n),32);}/*** 输出int类型的二进制* @param n* @return*/protected String toBinaryString(int n){return Integer.toBinaryString(n);}/*** 输出long类型的二进制* @param n* @return*/protected String toBinaryString(long n){return Long.toBinaryString(n);}}
原文作者:5ycode;如有侵权,请联系管理员删除。