C位运算分析及进制转换
作为C初学者,曾经的我在这个位运算和二进制的转换中始终搞不懂怎么去准换,怎么去搞懂。这里把我掌握的方法给大家分享下
- 二进制转换
- 位运算符
- 总结
二进制转换
- 二进制转八进制
二进制转换成八进制简易的办法,我们只需要记住0~7的二进制。对二进制从右向左计算。每隔3位计算
2进制 | 8进制 |
---|---|
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
对二进制从右向左,每3位进行截断
100010100101
100 010 100 101 前面不足三位补充0
这样我们就可以快速的进行计算了,上面这个结果得出来是:4245
八进制转换成二进制也一样的啦,倒推算就行了
to example:
() ====> ()
() ====> ()
- 二进制转十进制
二进制转换同八进制、十六进制的方法不同,不能用它们的方法来进行转换
二进制转换成十进制
1000101(2) ==> 1+2^6+1*2^2+1*2^0=64 + 4 + 1 = 69(10)
同理八进制或者16进制以及其他进制都可以按照这样的方式去计算,只不过相对于这种方式,八进制和十六进制没有一下说的方法简便
十进制转二进制
采用除2取余,逆序排法
10 to 2 example:
56/2=28 == >0
28/2=14 == >0
14/2=7 == >0
7/2=3 ==> 1
3/2=1 ⇒ 1
1/2=0 ==>1
逆序排法:111000
-
二进制转十六进制
其实二进制转换成十六进制道理也是一样的,区别在于二进制转十六进制是按照每4位从向左截断
2进制 | 16进制 |
---|---|
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
这里我们拆分一个看下:
1000 1010 0101
拆分过后我们就很容易得出这个十六进制:9A6
2 to 16 example:
1010 1010 1010(16) ==> AAA(2)
C5D2(16) ⇒ 1100 0101 1101 0010(16)
位运算
位运算,就是对一个比特(Bit)位进行操作。
c语言有六中位运算符
运算符 | 说明 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
按位与运算(&)
一个比特位只有0或者1两个取值,只有参与&(位与)运算的两个位都为1时,结果才为1,否则为0。例如1&1为1,0&0为0,1&0为0
数值在内存中是以二进制的形式中存在,7&8 可写算式如下:
0000 0111 7
&0000 1001 8
0000 0001 = 1
按位或运算(|)
参与或运算|的两个二进制位有一个为1时,结果就为1,两个都为0时结果才为0。例如1|1为1,0|0为0,1|0为1。
9|5可写算式如下:
00001001 (9的二进制)
|00000101 (5的二进制)
00001101 (13的二进制)
所以9|5=13。
按位或运算可以用来将某些二进制位置1,而保留某些位
按位异或运算(^)
按位异或运算
参与异或运算^的两个二进制位不同时,结果为1,相同时结果为0。也就是说,0^1为1,0^0为0,1^1为0。
9^5可写成算式如下:
00001001 (9的二进制)
^00000101 (5的二进制)
00001100 (12的二进制)
所以9^5=12。
按位异或运算可以用来反转某些二进制位
取反(~)
取反运算符~为单目运算符,右结合性,作用是对参与运算的数的各二进位按位取反。例如 ~1为0,~0为1。
~9的运算为:
~0000000000001001
1111111111110110
所以~9=65526。
位左移(<<)
左移运算符<<用来把操作数的各二进位全部左移若干位,高位丢弃,低位补0。例如:
a=9;
a<<3;
<<左边是要移位的操作数,右边是要移动的位数。
上面的代码表示把a的各二进位向左移动3位。a=00001001(9的二进制),左移3位后为01001000(十进制72)。
位右移(>>)
右移运算符>>用来把操作数的各二进位全部右移若干位,低位丢弃,高位补0(或1)。例如:
a=9;
a>>3;
表示把a的各二进位向右移动3位。a=00001001(9的二进制),右移3位后为00000001(十进制1)。
需要注意的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译器的规定。