20170828 - A - 二进制基础
1 Collection和Collections的区别是?
Collections是集合的一个帮助类,不用于实例化
Collection是所有集合的上级接口
2 计算机使用二进制的原因是什么?计算机内部的一切是什么类型数据?
二进制计算成本最优。二进制数据。
3 二进制的权是?十进制的是多少?
1,2,4,8,16
1,10,100,1000
4 二进制的基数是多少?十进制的是多少?
2,10
5 byte short int long float double boolean char分别是多少字节,多少位?分别能表示多少个数字?
1 2 4 8 4 8 2 1/8 16 32 64 16 8
char:2字节(16位),2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2 = 256(每位可表示2个数字)—— -128~127(中间还有一个0)
5 8位二进制数最大值如何表示?最小值是?-1是多少?如何计算-1?
(0)111111 / 10000000 / 11111111 / 先求出-1,再在-1基础上减取相差的值,如何计算相差的值?运算需注意什么?
如-11 ,相差10,1010,再从-1中删去。可省略开头0.
6 十六进制用于什么?
缩写二进制,将每四位二进制缩写成一个十六进制实例。
7 十六进制的10,11,12,13,14,15分别用什么代表?十六进制本质作用是什么?计算机中是否有十六进制的数据?
a,b,c,d,e,f,就是缩写二进制,无,实际上都是二进制。
8 int型实际有32位,是二进制的32位。(最前面0省略)
9 将该数用二进制,十六进制表示。
int n = 0x693ba5e5;
1101001001110111010010111100101
1765516773
10 如何将十进制的int型(long型呢)数据转化为二进制?如何表示16进制的数?
System.out.println(Integer.toBinaryString(n));/Long.toBinaryString(n)
0x......
11 补码的本质是什么?
即一个二进制所表示的十进制的值 与 它的二进制取反+1所表示的十进制的值为负数关系(最小值除外)
-n = ~n+1(n为二进制数。)
12 int类型的-1实际上是多少位二进制?
32个1.
15 二进制每一位代表多少?
2的(所在的位数-1)次方。
16 二进制的任意次位数最大值为多少?
8位:01111111
17 31次1和32次1分别是什么?
32位最大值(第一位0省略了)
-1
19 十六进制和二进制的关系是什么?
实际上就是用十六进制来表示二进制,可同等理解。
20 int型最大值,0,1,-1,最小值用二进制和十六进制表示分别是多少?
int为32位数据
最大值:31个1 / 0x7fffffff;(0x80000000)
0:32个0 / 0x00000000;
1:31个0和一个1 / 0x00000001
-1:32个1 / 0xffffffff
21 二进制的值和十六进制的值可以直接赋给int型数据吗?
二进制不行,二进制必须通过十六进制表示。
22 正数溢出是负数吗?溢出结果是随机数吗?
错误,溢出多了又变成了正数;错误。
23 互补对称,取反对称——一个二进制数和他的取反的关系。
二进制中一个数所表示的值的绝对值等于他的取反+1.(最小值除外)
二进制的取反:(1→0,0→1)
-3所表示的8位数据:1111 1101;(11111111-2)
取反:00000010→10(省略前面的0)
10+1:11
3
即一个二进制所表示的十进制的值 与 它的二进制取反+1所表示的十进制的值为负数关系(最小值除外)
24 ~x表示什么?
表示该数的二进制取反。
25 int n = 0xfffffffe;print(~n);输出为?
1
26 int n = -5;print(~n);输出为?
4
27 取反运算符为?
~
28 二进制运算符有?
取反 ~
与 &
或 |
左移位:<<
右移位:>>
逻辑右移位:>>>
29 位运算的用途:文字的编码。
30 一个字符表示需要用不重复的数来表示即unicode。
互联网数据单位为8节,因此若传送字符必须拆分成byte型(8位)进行传输,而字符拆分方案便被称为字符的编码。
最简单的拆分方案:UTF-16BE,无论中文和英文都是2字节,因此拆分方式为将字符一分为二。英文浪费八位(2个字节),支持65535个字符(因此用char便可支持)。
UTF-8则是变长编码,按照字符所需给字节。UTF-8编码分为一字节编码(0-127),二字节编码(127-2047),三字节编码(2047-65535),四字节编码(65535以上),当小于65535时,可用char表示,大于65535时,用int表示。
英文一个字节,中文三个字节。手机内的中文为2字节,经UTF-8编码后用三个字节传输。
Java char类型支持编码数量:65535
30 什么是unicode?
一个字符对应一个数字
31 int n = '中';是否会报错?如何求 中 的二进制值?
不会,计算中char型数据被看做int型数据。Integer.toBinaryString(n)
32 MAX_VALUE:01111111111111111111111111111111——最大值:31位的1
MIN_VALUE:10000000000000000000000000000000——最小值
33 UTF-8的特点是?
变长编码,英文一个字节,中文三个字节,支持四字节编码,支持100万+字符。
34 如何将字符数据(unicode)转化为utf-8编码?
获取字符数据最后6位
与运算(逻辑乘):&
n与掩码m与运算:00000000 00000000 00000000 00111111(0x3f)——获取最后六位。
两个数,对齐位置,上下计数与(1只有与1才得1)。
或 | 运算(逻辑加)
运算法则:有1变1.
35 java中可以直接用二进制表示数据吗?
不可以,当需要表示二进制时,用16进制来表示一个二进制中的四位数据。
36 如何解码编码?
一般默认为UTF-8编码,在明确是多少字节字符,英文为一字节编码,中文为三;若是中文则需分别获取中文字符的前四位,后六位,后六位(中文位于char型内,所以为16位,2个字节)
分别拼装到utf-8的传输字节中。用与获取,用或拼接,用逻辑运算符移位。
int head = word >>> 12 & 0xf | 0xe0;
int middle = word >>> 6 & 0x3f | 0x80;
int foot = word & 0x3f | 0x80;
int b3 = 0x80 | c & 0x3f;
System.out.println(Integer.toBinaryString(b3));
注意点:
int k2 = Integer.toBinaryString(c & 0x3f);×
输出为String类型数据。
int b3 = 0x80 | c & 0x3f;
十六进制可以直接参与int型运算
System.out.println(Integer.toBinaryString(b3));
可直接输出。
37 解码的api是?
String的构造
案例:
int c = '中';
//int k2 = Integer.toBinaryString(c & 0x3f);
int b3 = 0x80 | c & 0x3f;
int b4 = 0x80 | c>>>6; & 0x3f;
int b5 = 0xe0 | c>>>12 & 0xf;
byte[] bytes = {(byte)b5 ,(byte)b4 ,(byte)b3 };
String s = new String(bytes,"utf-8");
System.out.println(s);
38 手工解码
int cc = (b5 & 0xf)<<12 | (b4 & 0x3f)<<6 | (b3 & 0x3f);
char ch = (char)cc;
System.out.println(ch);
39 移位计算的数学意义是什么?
十进制右移一位,扩大十倍
二进制则扩大两倍
40 优化计算 n * 8 为?
n << 3(目标的开二次方.)
优化即移位
41 数学右移位 >> 其结果满足数学规律,整除向小方向取整,负数移位,高位补1,结果还是负数
n = -50;
n >> 2;()-25
n >> 1;()-13(往小位补)
逻辑右移位 >> 无论正负高位都补0。
n = -50;
n >> 2;()//变正数。
n >> 1;()
42 优化计算表达式 n = n + n/2 (n += n/2)
即将运算转化为移位
43 硬编码运算法则及二进制基础至脑内。
①二进制最大值,最小值,-1是什么?
首位为0,其他为1
最大值+1,即首位为1,其他为0
所有位为1.
②如何求一个二进制数的补码
③&(逻辑乘) 的运算法则分别是什么?
|(逻辑加——遇1则1)