java内置的进制转换
二进制00111000十进制为56即该负数正值为56,相反数为-56
无符号右移运算
异或运算2
异或运算1
或运算。。
与运算。。
二进制位运算
适合计算机的进制
十进制换算成二进制
二进制换算成十进制
关于原码反码补码
以下例子都为8字节
不论原码反码还是补码第一个数字0都表示正数,1表示负数
例:11110010的第一个数字是1表明该数是负数,对应十进制的-14
正数的原码补码反码都一样
负数的原码换成反码第一位不变,其他位取反
反码换成补码+1即可
例:-14的原码10001110,反码是11110001,补码是11110010
如果想知道一个补码对应的十进制是多少最简单的方法是先看第一位数字符号是1还是0确定正负,如果是正数可以直接得出十进制,如果是负数则根据补码求出原码,然后再得出具体数字
补充说明
0的补码是00000000,-1的补码是11111111(-1的原码是10000001)
0~127的补码就是按顺序往上加,00000000,00000001,00000002以此类推
-1~-128的补码则是按顺序往下减,11111111,11111110,11111101以此类推
之所以byte的取值范围是-128~127是因为正数是从0开始取而负数从-1开始取
求-14 << 2 的值? //计算机中数据是以补码的形式存储,补码 = 反码 + 1 14 源码 0000 1110 反码 1111 0001 补码 1111 0010 补码左移动2位 1100 1000 然后求反码 1100 0111 求源码 0011 1000 十进制就是:56 加上负号,最终结果就是,-56
一个字节(B)有8个二进制位(8bit)
补充:一般一个英文字符占用一个字节,因为美国人搞了一个ASCII编码,他们所有的符号也只有128(0~127)个,而128的二进制是1000 0000,所以一个符号占用一个字节,后来符号多了,还有汉字,所以有多了很多编码,像我们最常用的UTF8就是这样的。
常用进制换算
字符串 转化 字节
小端法:低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端
大端法:高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端
JAVA内置的进制转换
<< 左移 用来将一个数的各二进制位全部左移N位,高位舍弃,低位补0。
如果左移舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0。
每右移一位,则相当于该数除以2。
>>> 无符号右移运算 将一个数的各二进制位右移N位,高位补0。
& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
特殊用法:
(1) 清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
(2)取一个数中的指定位
x=1010 1110,取低四位,X&0000 1111= 0000 1110 即可得到。
方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。
l 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1,否则为0。
特殊用法:
(1)常用来对一个数据的某些位置1
例:将x=1010 0000的低4位置1 ,用x| 0000 1111 =1010 1111 即可得到。
方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“或运算”可以得到X中的某些位置1。
^ 异或运算 两个相应位为“异”(值不同),则该位为1,否则为0。
特殊用法:
(1)使特定位翻转,找一个数,对应X要翻转的位,各数的对应位为1,其余位为0,此数与X进行“异或运算”即可。
例:将x=1010 1110的低4位翻转 ,用x^ 0000 1111 =1010 0001即可得到。
(2)与0异或,保留原值
两个变量交换值的方法
1、借助第三个变量实现
2、利用加减法实现
A=A+B;B=A-B;A=A-B;
3、异或运算实现,效率最高的
A=A^B;B=A^B;A=A^B;
~取反运算
将二进制数按位取反,即将0变1,1变0
原码 一个整数按照绝对值大小转换成的二进制数称为原码。
反码 将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
补码 反码加1称为补码
负数以正数的补码形式表示
计算1开头的二进制
1、补码减1得到反码
2、反码取反得到原码
3、计算原码,取相反数
正数:原码=反码=补码 负数:反码=原码的所有位(符号位除外)取反 补码=反码+1
二进制转换成其他进制
交换两个数:
借助第三个变量
利用加减法实现两个变量的交换,A=A+B;B=A-B;A=A-B;
利用异或或运算来实现,也是效率最高,A=A^B;B=A^B;A=A^B;
JAVA内置的进制转换
大小端
小端法(Little-Endian)
低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端
高端法(Big-Endian)
高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端
原码:一个整数按照绝对值大小转换成的二进制数称为原码
反码:将二进制数按位取反,取得的新二进制数称为原二进制数的反码。
补码:反码加1称为补码
十进制转换二进制原理:
二进制逢二进位,十进制数x第一次除2取到的余数是二进制数y的个位(x中含有多少个2,多余的肯定是个位(x2^0)),商k1是x降低一位数的值大小,第二次除2取到的余数是y的十位大小(含有多少个4,多余是十位(x2^1))以此类推
好比十进制数求各位数值,第一次除10余数是个位(x10^0),商除10余数是十位(x10^1)
十进制数x同样可以第一次除2求个位,第二次x除4求后两位个位十位大小(注意这个值不是直接各位上的位数,而是后两位形成的新数的大小,所以需要减去个位再上一次计算的除数(似乎叫做权值))
以此类推就可以求到各位的数字
好比十位数第一次除10余数是个位,第二次原数除100求得是十位+个位形成的新数的大小,需要减去个位再除以上次计算的除数10,下一轮计算就需要除100这样,每一次的余数只需减去上一次的余数即可
总结:短除法化成二进制就是不断的除以二算出余数,其除以二的实质就是左移一位,(第一次是不够2余下的所以是个位,第二次是够2不够4的所以是十位)是想十进制的数字除以十就是相当于左移一位,剩下来的余数就是该位的数字同理化成二进制
程序中所有的数在内存中都是以二进制的形式存储的