最近对基于二进制的运算符是深有感受啊
一、二进制的概念
基于计算机内部组成原理,在内存中字节是可寻址的最小单位,每个1字节由8个0或1的二进制位组成(有时二进制位也称为比特,英文bit),最左边的二进制位称为最高位,最右边的二进制位称为最低位。如下图。
二进制表示数据的范围
a、无符号:0000 0000 -> 1111 1111; 对应的是0 - 256
b、有符号:
有符号数是针对二进制来讲的。用最高位作为符号位,“0”代表“+”,“1”代表“-” ;其余数位用作数值位,代表数值。
例如有符号的 0101 0101 该如何计算,最左边0表示+,那余下还有7为,计算时从右到左依次来
有符号的正数为85,那负数为-85,所以有符号二进制为 -85 到 +85
二、十进制转换二进制
10进制的125转成二进制就是 1111101 ,在计算机里补齐就是 0111 1101
三、二进制的实际应用
1、判断奇偶数
我之前也是摩2看余数的,现在有效率更高的做法,使用按位与效果更高,看结果是否为1即可判断是否为奇数。
2、通过『按位异或』运算,可以实现两个值的交换,而不必使用临时变量。
a=10100001, b=00000110
a=a^b; //a=10100111
b=b^a; //b=10100001
a=a^b; //a=00000110
3、互换二进制奇偶位,实现的功能是将一个int型的数的奇偶位互换,例如6的2进制为0110
,(从右向左)第一位与第二位互换,第三位与第四位互换,其余都是0不需要交换,得到1001
,输出应该为9
public static void main(String[] args) {
int n = 6;
int end = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
// 测试代码
System.out.println("6 的二进制 " + Integer.toBinaryString(6));
System.out.println("6 的偶数 " + Integer.toBinaryString(6 & 0xAAAA) +
";6 的偶数位右移动 " + Integer.toBinaryString((6&0xAAAA) >> 1));
System.out.println("6 的奇数 " + Integer.toBinaryString(6&0x5555) +
"; 6 的奇数左移动 " + Integer.toBinaryString((6&0x5555) << 1));
}
运行示例
分析:
-
问:示例中为什么要按位与 十六进制数啊?
0xAAAA=1010 1010 1010 1010(奇数都为1)0x5555= 0101 0101 0101 0101(偶数都为1)
通过按位与&,分别获得二进制110 偶位数 10,奇位数100
-
问:为啥要对提取后的二进制左位移?
答:你不移动位置怎么调换位置啊 -
问:为什么二进制的偶数是右移而左移动啊?
答:从第一小节(1、判断奇偶数)可见,偶数的二进制末尾是0,奇数的二进制末尾为1,所以偶数往右边移动不会丢数据,二奇数往右边移动肯定会丢数据的 -
问:6的二进制就三位,为啥左移动后变四位了,这样会不会偏离了?
答:一个byte最小单位是8个位对吧(见第一章二进制概念),按低位对齐,高位补全来将,6的二进制是 0000 0110,只是高位的0是无意义可以省略,所以偶数为10 >> 1 = 0001,100 << 1 = 1000,0001 | 1000 = 1001 = 9