单位的换算:
& -- 位与
| -- 位或
~--取反
^ 异或
<< 左移
>> 右移
十六进制:0 1 2 3 4 5 6 7 8 9 a b c d e f
十进制:0 1 2 3 4 5 6 7 8 9
八进制:0 1 2 3 4 5 6 7
十六进制转成二进制
0x 1 2 3 4 5 6 7 8
0001 0010 0011 0100 0101 0110 0111 1000
八进制转成二进制
4 5 6
100 101 110
十进制转成二进制
10
1010
十进制负整数转换为二进制数:
例如:-29
第一步:先将该负整数对应的正整数转换为二进制数。
十进制数29的二进制数为00011101。
第二步:对得到的二进制数取反。
二进制数00011101取反为11100010。
第三步:加1。
11100010加1为11100011。
因此,十进制数-29转换为二进制数11100011。
补码如何应用?
例1:
假设两个四位二进制数0111和0110为无符号数,我们来计算一下两者之间的减法:0111-0110=7-6=1。
由于计算机没有减法运算,我们可以先求减数相对应的补数,四位二进制数的模为2^4=16,那么6的补数为16-6=10,也就是说7-6=7+10=17,0111-0110=0111+1010=10001。
因为只有4位,所以最高位省略,得到0001=1,正好是原本的计算结果。
例2:
假设两个四位二进制数0101和0011为无符号数,我们来计算一下两者之间的减法:0101-0011=5-3=2。
由于计算机没有减法运算,我们可以先求减数相对应的补数,四位二进制数的模为2^4=16,那么3的补数为16-3=13,也就是说5-3=5+13=18,0101-0011=0101+1101=10010。
因为只有4位,所以最高位省略,得到0010=2,正好是原本的计算结果。
特点:
1. 补码的符号可以看做是数值的一部分参与运算;
2. 在补码表示中,0只有一种表示方法;
3. 负数补码表示的范围比原码稍宽
首先,我们来看几个4位二进制数进行运算的例子!
在原码下,1-1=1+(-1)=0001+1001=1010=-2
我们可以看出,由于符号位参与计算,对于减法来说,用原码表示计算结果并不正确。
在反码下,1-1=1+(-1)=0001+1110=1111=-0
我们可以看出,用反码表示计算结果问题出现在“0”这个特殊数值上,正常来说,0不应该带符号,0带符号没有任何意义。
在补码下,1-1=1+(-1)=0001+1111=0000=0
我们可以看出,真值没有问题,0带符号的问题也解决了!
综上所述,我们使用补码的原因主要有以下两个方面:
第一,我们人脑可以知道原码的第一位是符号位,但是计算机不知道,而恰好补码表示中的符号位可以与数值位一起参加运算,弥补了计算机不能辨别符号位的缺憾。
第二,我们人脑可以快速计算减法,但是计算机很难做到,所以我们根据运算法则——减去一个正数等于加上一个负数,将减法运算转换成为加法运算,对计算机而言,这大大地简化了运算的过程。
位操作符
& 与运算 两个位都是1时,结果才为1,否则结果为0
10011
& 11001
= 10001
| 或运算 两个位都是0时,结果才为0,否则结果为1
10011
| 11001
= 11011
^ 异或运算 两个位相同则为0,不同则为1
10011
^ 11001
=01010
~ 取反运算,1则变为0,0则变为1
~10011
= 01100
<< 左移
左移一位相当于*2
<<左移运算,向左进行移位操作,高位丢弃,低位补0
0000 0010=2
左移一位:0000 0100=4
左移三位:0001 0000=16
以32位机为例:
int a=8;
a<<3
移动前:0000 0000 0000 0000 0000 0000 0000 1000
移动后:0000 0000 0000 0000 0000 0000 0100 0000
>> 右移
右移一位相当于/2
0000 0100=4
右移一位:0000 0010=2
右移三位:0000 0000=0
int a=8;
- >3
移动前:0000 0000 0000 0000 0000 0000 0000 1000
移动后:0000 0000 0000 0000 0000 0000 0000 0001
位运算小技巧
判断奇、偶数
核心:判断二进制最后一位是不是等于1,为1是奇数,为0是偶数
交换两个数
两个相同的数异或等于0,任何数和0异或等于它本身
异或运算满足交换律和结合律
a=5 b=8
例题:int a=3, b=6
c=a^b<<2;
a=3=0011 b=6=0110
b<<2=0001 1000=24
a^b=0000 0011 ^ 0001 1000=0001 1011=27
将第七位置0
以32位机为例
x= 1111 1111 1111 1111 1111 1111 1111 1111
方法一:~(1<<7)&x
0000 0000 0000 0000 0000 0000 0000 0001<<7
= 0000 0000 0000 0000 0000 0000 1000 0000
方法二:~(1<<7)^x
= 1111 1111 1111 1111 1111 1111 0111 1111
将特定位置置位
x=0x12345678 将4-7位置0x3
(0xfffffff0=1111 1111 1111 1111 1111 1111 1111 0000
0xffffffff=1111 1111 1111 1111 1111 1111 1111 1111)
x&0xffffff0f=0001 0010 0011 0100 0101 0110 0000 1000
| 0x3<<4=0000 0000 0000 0000 0000 0000 0011 0000
=>0001 0010 0011 0100 0101 0110 0011 1000
先将特定位置0,再把准备替换的数对应上位置,最后或
取32bit无符号整数0x12345678的高16bit和低16bit,分别保存在两个16bit的无符号整数并显示出来。
文件权限
读内容的权限 可读 r 4
写内容的权限 可写 w 2
执行的权限 可执行 x 1
属主:所属的用户,文档所有者,这是一个账户,这是一个人
属组:所属的用户组,这是一个组。