进制转换、位运算、逻辑运算
一.
计算机中的进制表示
二进制:用0-1表示,满2进1
八进制:用0-7表示,满8进1
十进制:用0-9表示,满10进1
十六进制:用0-9,A~F表示,满16进1
如何计算7的二进制?(注意,这里7是10进制。)
二进制如何转十进制呢?
十进制转八进制如何转呢?
十进制如何转十六进制呢?
负数的二进制如何表示呢?(取反+1)
int 类型的数据在内存中占32个二进制位即 4个字节,一个字节(byte)等于8个二进制位,6的二进制位为110,补齐23位为:
总结:八进制三位表示一位,所以八进制一位的最大值为7,即111=7,而十六进制四位表示一位,所以十六进制一位的最大值为15,即1111=15
二. 左移<<
定义:
(将某个数的二进制位向左移动n个二进制位,并将已经移出的二进制位舍去,并在最右端也就是最低位补n个零,得出最新的结果)。
书写:3<<2表示将3所表示的2进制数向左移动2个二进制位。
步骤:
3<<2
1. 先将3转化为32位的2进制表示形式
2. 将转化出来的二进制数向左移动2个二进制位
3. 然后在最右端也就是最低位空出来的位置补充2个0
4. 算出最终结果
计算:
1. 计算3<<2的结果
2. 计算3<<1的结果
3. 计算3<<3的结果
根据以上的出左移的结论是: 其实就是用被移数乘以2的移动位数的次幂,而且往左移动越多,结果越大。
三. 右移>>
定义:
(将某个数的二进制位向右移动n个二进制位,并将已经移出的二进制位舍去,并在最左端也就是最高位补n个与原来高位一样的数,得出最新的结果)。
书写:6>>2表示将6所表示的2进制数向右移动2个二进制位。
步骤:
6>>2
5. 先将3转化为32位的2进制表示形式
6. 将转化出来的二进制数向左移动2个二进制位
7. 然后在最右端也就是最低位空出来的位置补充2个0
8.
算出最终结果
计算方式和左移一样,区别在于,左移空缺位置固定是补充0,而右移空缺位置补充的数根据原来最高位的数来定,假如原来最高是1,则全部补1,否则补充0
示例:
通过计算,6>>2 = 1 6>>1=3
根计右移计算结果,可以得出规律,其实就是将被移数除以2的移动数的次幂,而且往右移动越多,结果越小(因为都将有效位置都移除掉了)。
注意:<< 和>>的计算速度是最快的,比其他任何计算方法都块。
四. 异或^(0=false,1=true)
false |
^ |
false |
= |
false |
true |
^ |
false |
= |
true |
false |
^ |
true |
= |
true |
true |
^ |
true |
= |
false |
规律:两边相同为false,不同为true。
计算6^5 =3
6的二进制表示形式为 110
5的二进制表示形式为 101
异或运算:1表示true,0表示false。
7^4^4=7
7^5^5=7
7^8^8=7
根据上面3个的计算结果可以的出结论:一个数异或同一个数两次,结果还是那个数,这个特性可用来加密文件,就是将某一个文件用一个数进行异或一次之后,将不是原来的数据性质了,就不能使用了,那么再用这个数异或一次就被解密了,还原到原来的数了。
五. 与&运算符(0=false,1=true)
false |
& |
true |
= |
false |
false |
& |
false |
= |
false |
true |
& |
true |
= |
true |
true |
& |
false |
|
false |
6&3 =2
六.
或|运算符号(0=false,1=true)
false |
| |
true |
= |
true |
false |
| |
false |
= |
false |
true |
| |
false |
= |
true |
true |
| |
true |
= |
true |
6|5 =7
七. ~反码
~6 = -7
八. 练习:
1.
请以计算机的角度用一种效率最高的方法计算2*8的结果。
利用左移的方法:2<<3
2. int m = 8 , n =3 交换m,n的值。
A. 通过第三方变量int temp;
int temp ;
temp = n;
n = m;
m = temp;
B.
不用第三方变量()
n = n+m;
m = n - m
n = n – m;
这种方式存在局限性,如果n和m的值比较大的时候,就超出int类型的空间范围,容易损失精度。
C.
采用异或的特性(技巧性的方法,大众阅读性差)
n = n ^ m;
m = n^ m; --> (n^m) ^m =n;
n = n^m; -->n^(n^m)=m;
九.
在程序中如何计算出一个数的十六进制表现形式?
0000 0000 0000 0000 0100-1100 1110 0110
0000 0000 0000 0000 0100 1100 1110 0110
& 0000 0000 0000 0000 0000 0000 0000 1111
--------------------------------------------------------------------------
0000 0000 0000 0000 0000 0000 0000 0110
--> 以上& 15 后,单独的取出了十六进制数的第一个四位
那如果要单独取出十六进制数的第二个四位怎么办?
-->可以将原来数字右移4为再 & 15就可以了
-->示例:
60的十六进制:
int n1 = 60&15 ; int temp = 60>>4 ; int n2 = temp & 15;
-->十六进制数中不能以10,11,12,13,14,15表示,只能以A~F来表示,那么
在程序中怎么去的到这个字母表现?
例如: 14怎么去的它的字母?--> (char)14-10+'A';