/**
* 向左移位,相当于十进制数据转换成二进制,然后末尾添m位0
* 计算结果证明,等于传入数字翻倍效果
* 例53,左移1位后,变106
* 左移两位,结果212,相当于53*2*2
* 左移三位,结果424,相当于53*2*2*2
*
* 十进制53 转换为二进制 连续除2,若有余,记1。若整除,记0。
* 例:
* 53/2=26余1 记1
* 26/2=13余0 记0
* 13/2=6余1 记1
* 6/2=3余0 记0
* 3/2=1余1 记1
* 1结束。 记1
* 转换结果:110101
* @param num
* @param m
* @return
*/
public static int leftShift(int num,int m){
num = num << m;
return num;
}
/**
* 向右移位,相当于十进制数据转换成二进制,然后舍去末尾m位
*
* 二进制110101 转十进制,底数为10
* 如:
* 1 | 1*2^5
* | +
* 1 | 1*2^4
* | +
* 0 | 0*2^3
* | +
* 1 | 1*2^2
* | +
* 0 | 0*2^1
* | +
* 1 | 1*2^0
* 计算规则如下,为0的不加,1的相加。
* 得53
*
* 右移一位,变成11010 按照上述规则 转换成十进制,得26 刚好是53/2的整数商
* 右移两位 得13
* 右移三位 得6
* @param num
* @param m
* @return
*/
public static int rightShift(int num,int m){
num = num >> m;
return num;
}
计算机为什么要使用二进制,这个跟系统的硬件实现有关系,组成计算机系统的逻辑电路通常只有两个逻辑,即开关的打开或关闭的状态。0为关闭,1为打开。即便系统受到一定的干扰,它也可以可靠的分辨出,数字0或者1。
因此,在具体的系统实现中,二进制的数据表达有抗干扰,高可靠的优点。
有个疑问,为什么不用十进制呢,可以更清楚的表达。
那我解释下,假设底层使用十进制的话,那就需要判断10种状态,在后续业务繁杂的情况下,状态判断就会很艰难,出错的机率会变大。
二进制也比较适合逻辑运算,比如真或者假。
位的逻辑操作:
1,“ 或 ”==" | "
参与操作的位中,只要有一位是1,则为1。
例:
"1 1 0 1 0 1";
或
"1 0 0 0 1 1";
结果: "1 1 0 1 1 1";
2,“ 与 ”==“ & ”
参与操作的位中,只有全部是1,才为1。
例:
"1 1 0 1 0 1";
与
"1 0 0 0 1 1";
结果: "1 0 0 0 0 1";
3,“ 异或 ”==“ ^ ”
它具有排异性,就是说参与操作的位中,必须不相同才为1,不同则为0。两个相同的数值,按位异或结果为0,是相等的必要充分条件,
例:
"1 1 0 1 0 1";
异或
"1 1 0 1 0 1";
结果:"0 0 0 0 0 0";
网友评论