网站手机版跳转 seo,微信公众号的微网站怎么做,石家庄平台公司,怎么做网站企业文化栏目目录 二进制介绍二进制2进制转10进制10进制转2进制数字2进制转8进制和16进制2进制转8进制2进制转16进制 原码、反码、补码移位操作符左移操作符右移操作符 位操作符#xff1a;、|、^逗号表达式 二进制介绍
在初学计算机时我们常常会听到2进制、8进制、10进制、16进制…… 目录 二进制介绍二进制2进制转10进制10进制转2进制数字2进制转8进制和16进制2进制转8进制2进制转16进制 原码、反码、补码移位操作符左移操作符右移操作符 位操作符、|、^逗号表达式 二进制介绍
在初学计算机时我们常常会听到2进制、8进制、10进制、16进制…这些听着非常高级的词语其实8进制、10进制、16进制几乎和2进制非常相似只是稍微有一些不同下面我们对这些进行较详细的介绍
二进制
我们举一个例子比如用不同进制形式来表示数值15
15的2进制1111
15的8进制17
15的10进制15
15的16进制F我们还是先从熟悉的10进制开始讲解 在我们学过的加减法中我们常常用这样的方式进行计算 由于个位数字相加满10于是向十位数进1而十位数也满十于是向百位数进1 因此我们从这里可以得知所谓的十进制其实是满10进1并且每位数字是不能超过10的 其实其他进制也相同比如2进制 •2进制为满2进1 •2进制的数字每⼀位都是0~1的数字组成 所以1011就是15的二进制数了
2进制转10进制
10进制的123表示的值是⼀百二十三为什么是这个值呢其实10进制的每一位是权重的10进制的数字从右向左是个位、十位、百位…分别每一位的权重是10^0 , 10^1 , 10^2 … 如下图 2进制和10进制是类似的只不过2进制的每⼀位的权重从右向左是:2^0 , 2^1 , 2 ^2… 如果是2进制的1101该怎么理解呢
10进制转2进制数字
方法如图 我们只需要对125不断的除2即可得到125在2进制中的数字其实这里我还没有完全理解为什么这样就可以得出结果所以后期如果我想通了会在这里加上自己的理解
2进制转8进制和16进制
2进制转8进制
8进制的数字每一位是0~ 7的0~7的数字各自写成2进制最多有3个2进制位就足够了比如7的二进制是111所以在2进制转8进制数的时候从2进制序列中右边低位开始向左每3个2进制位会换算⼀个8进制位剩余不够3个2进制位的直接换算 如2进制的01101011换成8进制01530开头的数组会被当做8进制
2进制转16进制
16进制的数字每⼀位是0~ 9,a~ f10~15 的数字各自写成2进制最多有4个2进制位就足够了 比如f的二进制是1111所以在2进制转16进制数的时候从2进制序列中右边低位开始向左每4个2进制位会换算⼀个16进制位剩余不够4个二进制位的直接换算 如2进制的01101011换成16进制0x6b16进制表示的时候前面加0x
原码、反码、补码
整数的2进制表示方法有三种即原码、反码和补码 三种表示方法均有符号位和数值位两部分符号位都是用0表示“正”用1表示“负”而数值位最高位的⼀位是被当做符号位剩余的都是数值位。 正整数的原、反、补码都相同。 负整数的三种表示方法各不相同。 原码直接将数值按照正负数的形式翻译成二进制得到的就是原码。 反码将原码的符号位不变其他位依次按位取反就可以得到反码。 补码反码1就得到补码
对于整形来说数据存放内存中其实存放的是补码 因为在计算机系统中数值⼀律用补码来表示和存储。原因在于使用补码可以将符号位和数值域统⼀处理同时加法和减法也可以统⼀处理CPU只有加法器此外补码与原码相互转换其运算过程是相同的不需要额外的硬件电路
移位操作符
操作符号如下 左移操作符 右移操作符 注移位操作符的操作数只能是整数因为原码、反码、补码中提到的是整数的2进制如果是小数的话不能表示但是我记得好像有小数表示的方法只不过不知道能不能用在这里可能是我没搞清楚
左移操作符 右移操作符
移位规则首先右移运算分两种 1.逻辑右移左边用0填充右边丢弃
2.算术右移左边用原该值的符号位填充右边丢弃 特别提醒对于移位运算符不要移动负数位这个是标准未定义的而且也没有必要这样 比如
int num 10;
num-1;//error位操作符、|、^
位操作符有
1. //按位与 对应位同时为“1”时才为“1”否则为0
2.| //按位或 对应位只要有一个为1就为1
3.^ //按位异或 对应位相同为 0不同为 1。
注他们的操作数必须是整数代码如下
#include stdio.h
int main()
{int num1 -3;int num2 5;num1 num2;num1 | num2;num1 ^ num2;
return 0;
}下面有⼀道面试题 不能创建临时变量第三个变量实现两个数的交换 法一
可能有很多人都会这样做
#include stdio.h
int main()
{
int a 10;
int b 20;
a ab;
b a-b;
a a-b;
printf(a %d b %d\n, a, b);
return 0;
}这种做法有一个缺陷就是如果ab过大就会导致出错因为int有范围限制所以这种方法也要分情况用 我们看看法二
#include stdio.h
int main()
{
int a 10;
int b 20;
a a^b;
b a^b;
a a^b;
printf(a %d b %d\n, a, b);
return 0;
}这种方法就很难想到了但是也有缺陷就是如果是有负数的话结果就会有问题因此这方法仅适用于正数
例题编写代码实现求⼀个整数存储在内存中的二进制中1的个数
//⽅法1
#include stdio.h
int main()
{
int num 10;
int count 0;//计数
while(num)
{
if(num%2 1)
count;
num num/2;
}
printf(⼆进制中1的个数 %d\n, count);
return 0;
}//⽅法2
#include stdio.h
int main()
{
int num -1;
int i 0;
int count 0;//计数
for(i0; i32; i)
{
if( num (1 i) )
count;
}
printf(⼆进制中1的个数 %d\n,count);
return 0;
}//⽅法3
#include stdio.h
int main()
{
int num -1;
int i 0;
int count 0;//计数
while(num)
{
count;
num num(num-1);
}
printf(⼆进制中1的个数 %d\n,count);
return 0;
}逗号表达式
逗号表达式就是用逗号隔开的多个表达式。 逗号表达式从左向右依次执行。整个表达式的结果是最后一个表达式的结果。如果左边表达式为假就不用执行右边的表达式了
//代码1
int a 1;
int b 2;
int c (ab, ab10, a, ba1);//逗号表达式
//代码2
if (a b 1, ca / 2, d 0)
while (a get_val(), count_val(a), a0)
{
..........
}