C位运算分析及进制转换

C位运算分析及进制转换

作为C初学者,曾经的我在这个位运算和二进制的转换中始终搞不懂怎么去准换,怎么去搞懂。这里把我掌握的方法给大家分享下

  • 二进制转换
  • 位运算符
  • 总结

二进制转换

  • 二进制转八进制

二进制转换成八进制简易的办法,我们只需要记住0~7的二进制。对二进制从右向左计算。每隔3位计算

2进制8进制
0011
0102
0113
1004
1015
1106
1117

对二进制从右向左,每3位进行截断
100010100101
100 010 100 101 前面不足三位补充0
这样我们就可以快速的进行计算了,上面这个结果得出来是:4245
八进制转换成二进制也一样的啦,倒推算就行了

2 to 8 example:
101 010 001(2)  ====>   521(8)
2641(8)  ====>   010 110 100 001(2)
  • 二进制转十进制

二进制转换同八进制、十六进制的方法不同,不能用它们的方法来进行转换

二进制转换成十进制
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进制
00011
00102
00113
01004
01015
01106
01117
10008
10019
1010A
1011B
1100C
1101D
1110E
1111F

这里我们拆分一个看下:
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 取决于编译器的规定。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值