天天看点

C位运算分析及进制转换C位运算分析及进制转换

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 取决于编译器的规定。