C语言中常用的进制转换有二进制,十进制,八进制,十六进制。下面我们就来讲解这些进制的转化。
十进制与二进制的转换
我们十进制转二进制,以123为例,我们将123除以2得到的商(61)写在123下面,余数(1)写在123之后,继续用得到的商1去除2,再得到商(30)余数,重复计算直到商为0,将得到的余数倒着打印出来就是二进制。
二进制转十进制很简单。从二进制数最右边一位起,该位数字乘以2的0次方,往左移一位,乘以的2的次方数就加1,比如右边起第二位数字乘以2的1次方。将所有这样计算得出的结果相加,就得到对应的十进制数。
(如图):
二进制与八进制与十六进制的转化
将二进制数转换为八进制数,可按以下步骤进行:从二进制数的最右边开始,每三位分为一组。对于每一组:
1. 从右至左,给每位数字乘以 2的相应次方,最右边的数字乘以 2的0次方,向左一位乘以 2的1次方,再向左一位乘以 2的2次方。
2. 将这三位数字乘以相应次方后的结果相加,得到的和就是八进制数中的一位。
3. 若最左边一组不足三位,就在左边补 0 凑足三位,再按上述方法计算。
将二进制转化为十六进制数,可以按以下步骤进行:从二进制数的最右边开始,每四位分为一组。对于每一组:
1. 从右至左,给每位数字乘以 2的相应次方,最右边的数字乘以 2的0次方,向左一位乘以 2的1次方,再向左一位乘以 2的2次方。
2. 将这四位数字乘以相应次方后的结果相加,得到的和就是十六进制数中的一位。
3. 若最左边一组不足四位,就在左边补 0 凑足四位,再按上述方法计算。
注意:若想要达到十进制转八进制或十六进制,那么需进行两步骤:
1:先将十进制转换为二进制在通过二进制转换为八进制或十六进制。反之亦然。
操作符详解
关于操作符这里我们讲解常用的这些操作符(如:<<左移操作符,>>右移操作符
<<左移操作符
移位规则:左边抛弃,右边补0;(移位的操作只能是整数)(移位只能是移动补码)
在了解这个之前我们先来了解整数的二进制表示:
整数的二进制表示有3种:源码,反码,补码。(int==四个字节==32位)
首位(最左边数)是符号位,1代表负数,0代表正数。
反码就是除了符号位的其它位如果是1就变成0,是0就变成1;
补码就是在反码的基础上加1;
(注意:整数源码,反码,补码都是一样的,而负数才是源码,反码,补码有区别)
下面我们来用实例演示:
当a左移一位最左边的0去掉,最右边补上0;最后按照二进制转十进制得出b对应的数值20.
右移操作符>>
移动规则:
1.逻辑右移:向右移动,左边补0
2.算数右移:向右移动,左边补对应符号位(大部分编译器采用算数右移)
具体操作如下例演示:
(如图)
注意):对于左移操作符和右移操作符我们都不可以移动负数位
比如5>>-1应该写为5<<1才对
按位与&
按位与同样是两个整数的补码进行比较,如果两个补码都为1则为1,两个补码不同(其中有一个为0)则为0。
同样我们通过事例来说明:
(如图)
按位或|
操作方式:两个整数的补码相比,如果其中有一个有1就为1,没有则为0。
具体操作如图:
按位取反~
操作方法:将整数的补码全部取反(0变成1,1变成0)包括符号位。
存储的是补码,输出计算时要先取反再+1得到源码,对二进制源码计算输出数字。
按位异或^
操作方法:相同为0;相异为1;
具体操作为图所示:
(如图)
下面是一个使用异或操作符的实例:
题目:我们在不添加第三个变量的前提下实现a数与b数的交换。
如图:
理解这个题目我们首先要知道的点有:
1.a^a 等于0
2.0^a 等于a(如图)
下面我们通过按位与&来判断一个数的二进制位有多少个1
我们在做这题之前我们要知道当n&1的时候如果等于==1就说明这个n的最后一位二进制位上是1,如果n&1等于0那就说明n最后一位二进制位为0。(如图)
以上就是我对几个逻辑操作符的全部介绍(dogs)