如何进行二、八、十六进制转化和位操作?

一、进制转化

  • 下面链接说明了各个进制整数的转化
    二、八、十、十六进制间转化
  • 这里补充一下浮点数的转换
    • 转换规则:小数部分乘以2取整,一直循环,直到小数部分为0,将每次计算的整数部分顺序排列即可。
    • 下面看下具体的例子(数字左下角的标号表示该数是以什么进制表示,没有标识的默认为十进制)。
      • 十进制浮点数-0.5, 0.5 ∗ 2 = 1.0 0.5*2 = 1.0 0.52=1.0,乘积结果整数部分为1,小数部分为0,所以它的转化一步到位,最终二进制结果是 − 0. 1 2 -0.1_2 0.12
      • 十进制浮点数5.9375,首先转换整数部分 5 10 5_{10} 510,转换成二进制是 10 1 2 101_2 1012。然后看小数部分, 0.9375 ∗ 2 = 1.875 , 0.875 ∗ 2 = 1.75 , 0.75 ∗ 2 = 1.5 , 0.5 ∗ 2 = 1.0 0.9375*2 = 1.875, 0.875*2 = 1.75, 0.75*2 = 1.5, 0.5*2 = 1.0 0.93752=1.8750.8752=1.750.752=1.50.52=1.0
        所以他的最终结果是把每次计算结果的整数部分顺序排列为 0.11 1 2 0.111_2 0.1112, 最终结果为 101.11 1 2 101.111_2 101.1112
      • 十进制数3.1875,首先整数部分 3 10 3_{10} 310 = 1 1 2 11_2 112,然后看小数部分 0.1875 ∗ 2 = 0.375 , 0.375 ∗ 2 = 0.75 , 0.75 ∗ 2 = 1.5 , 0.5 ∗ 2 = 1.0 0.1875*2=0.375, 0.375*2 = 0.75, 0.75*2 =1.5, 0.5*2 = 1.0 0.18752=0.375,0.3752=0.75,0.752=1.5,0.52=1.0, 每次计算结果的整数部分顺序排列为 0.001 1 2 0.0011_2 0.00112,最终结果为 3.187 5 10 = 11.001 1 2 3.1875_{10} = 11.0011_2 3.187510=11.00112
  • 特别说明一下,上面例子中的数都是我刻意选出来的,刚好能够用二进制形式准确的表示,事实上很多浮点数无法在计算机中准确的存储,只能是无限接近。下面这个链接是一个人家写好的进制转换计算器,可以玩一下:在线进制转换计算器

二、数据存储

①数值的原码表示

  • 在这之前,先来了解一下数据的存储形式:计算机中数据是以二进制的形式存储的。8个二进制位(bit)组成一个字节(byte),连续的两个字节构成了一个字(word)。这八个二进制位最左端的称为最高位,最右端的称为最低位。
  • 数值的原码是指,最高位用作符号位(0表示整数。1表示负数),其余各位代表数值本身的绝对值(以二进制表示)的表示形式。列如+9原码是00001001、-9是10001001、其中符号位上的0表示正,1表示负。

②数值的反码表示

数值的反码表示分两种情况:

  • 正数的反码与原码相同,如+9的反码是00001001。
  • 负数的反码符号位为1,其余各位为该数绝对值的原码按位取反(1变0,0变1),列如,因为-9是负数,则其反码符号位为1;其余7位为-9的绝对值+9的原码0001001按位取反为1110110,所以-9的反码是11110110。

③、数值的补码表示

数值的补码表示也分为两种情况:

  • 正数的补码与原码相同,列如+9的补码是00001001。
  • 负数的补码符号位为1,其余位为该数绝对值的原码按位取反,然后整个数加1。列如因为-9是负数,则符号位为1;其余7位为-9的绝对值+9的原码0001001按位取反为1110110;再加一,所以-9的补码是11110111。

已知一个数的补码,求原码的操作分两种情况:

  • 如果补码的符号位为0,表示一个正数,所以补码就是该数的原码。
  • 如果补码的符号位为1,表示一个负数,求原码的操作可以是符号位不变,其余各位取反,然后在整个数加1。

列如,已知一个补码为11111001,则原码是10000111(-7),计算过程就是按上述方法一一展开。
在计算机系统中,数值一律用补码表示,这是因为,使用补码可以将符号位和其它位统一处理,同时减法也可以按加法来处理,另外两个用补码表示的数相加时,如果最高位有进位,则进位被舍弃。

三、位运算

简介:

运算符含义
&按位与
|按位或
^按位异或
~取反
<<左移
>>右移
  • 上述六种位运算中,其中按位取反是单目运算符,其余都是双目运算符。
  • 位运算的运算对象只能是整形(int,short,long,unsigned)或字符型数据,而不能是实形数据,%求余也只能是整形或字符型。
    下面分别介绍:

①按位与&

参与运算的两个数取二进制,然后将对应的各二进制位进行与(&)运算。按位相与的运算与“逻辑与”相类似,只有两个二进制位都为1时才为1, 有一个为0时,则为0。
“按位与”常用来将一个数的某些位清零,或者保留某些位, 将数据与另一个数做按位与运算, 要保留的位,在这个数中,对应的位取1, 要清零的对应位取0。
for example:
9&5运算得1;代码验证:

#include <stdio.h>
int main()
{
	printf("%d", 9&5);
	return 0;
} 

运算结果:

深度解析
9&5具体运算过程如下:
 00001001
&00001001
--------------------
 00000001
所以。

送福利了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值