------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
进制
简介:今天老师讲了进制的知识,我总结了下述知识点,并在最后编写了自己的练习代码巩固所学知识
一、进制的概念
计数方式,数值的表示形式
二、常见进制
二进制、十进制、十六进制和八进制
三、进位方法
十进制:满十进一
二进制:满二进一
八进制:满八进一
十六进制:满十六进一
四、机器数与真值
机器数:所谓机器数,就是数据在计算机中的二进制形式。
真值:所谓真值,是指机器数表示的实际数字。
注意事项:
真值:所谓真值,是指机器数表示的实际数字。
注意事项:
1)机器数是带有符号的
2)机器数不一定唯一表示一个真值
3)有符号类型与无符号类型
五、原码、反码和补码
原码、反码和补码
数据存储在计算机中需要以一种形式进行存储,而原码、反码和补码即为数据存储细节方面的专业术语。说白了就是存储原理。
首先数据的存储方式是:
在计算机中,数据都是以补码的形式进行存储
正数:反码 == 补码 == 原码
负数:原码即为符号+二进制
反码== 原码除符号位取反
补码== 反码 + 1
六、位运算
位运算符简介
所谓的位运算,即是在数据的二进制格式下进行计算。
所谓的位运算,即是在数据的二进制格式下进行计算。
C 语音的位运算符常见的有:按位与、按位或以及按位异或和安慰取反,还有左移和右移等。位运算是专门处理整数运算的。
位运算
按位与(&)同1为1
按位或(|)同0则0
按位取反(~)10互反
按位异或(^)同0异1
左移(<<)
右移(>>)
代码练习内容:
一、将十进制数使用位运算的方式输出二进制数
// Created by george on 15/4/3.
//
//输出二进制数
#include <stdio.h>
int main(int argc, const char * argv[]) {
int num, a[32]={0};
printf("请输入十进制数字:\n");
scanf("%d",&num);
//由于int类型8个字节,共32个二进制位,所以用来保存二进制数的数组和计算次数均为32次
for(int k = 0;k < 32; k++){
//从最高二进制位开始取,所以向右移,将最高位移到最右,与1做位与,保存在数组中
a[k] = (num >> (32 - k - 1))&1;
}
for(int i = 0; i < 32;i++){
printf("%d",a[i]);
//每四位增加输出一个空格,结果更容易观察
if( (i + 1)%4 == 0){
printf(" ");
}
}
printf("\n");
return 0;
}
二、输入10个数,求出这10个数的和、平均值、最大值、最小值
//
// Created by george on 15/4/3.
//
//输入10个数,求出这10个数的和、平均值、最大值、最小值
#include <stdio.h>
int main(int argc, const char * argv[]) {
int sum = 0;
//定义长度为10的数组,初始化为0
int num[10]={0};
//定义并初始化最小值和最大值变量
int min = num[0],max = num[0];
//提示输入数字
for(int i = 0; i <10;i++){
printf("请输入第%d个数字:\n",i+1);
scanf("%d",&num[i]);
}
printf("\n");
min = num[0];
//进行最大值最小值的比较
for(int i = 0;i < 10;i++){
sum += num[i];
if(min > num[i]){
min = num[i];
}
if(max < num[i]){
max = num[i];
}
}
//打印计算结果
printf("和为%d,平均值%lf,最大值%d,最小值%d\n",sum,(double)sum/10.0,max,min);
printf("\n");
return 0;
}
三、自我拓展练习:利用商余发求出正整数的n进制数(n在2和16之间)
----编程思想已写在注释中,其中用到了goto语句。int类型转换到char类型用来兼容10进制以上要输出字符的条件
//以25转换为2进制为例
// 25 25/2 == 12 25%2 == 1
// 1 12 12/2 == 6 12%2 == 0
// 0 6 6/2 == 3 6%2 == 0
// 0 3 3/2 == 1 1%2 == 1
// 1 1 1/2 == 0 1%2 == 1
// 25转换为2进制后为 11001
#include <stdio.h>
void transNum(int num1,int n){
//定义一个为0的空数组存储计算得到的各位数字,
//i和tmp是在运算前确定生成后的数位有几个
int num[30]={0},i = 1, tmp = num1;
//首先排除两种情况,一是输入的数字小于进制数,这样直接把数字赋值给数组等待label1处理
if(num1 < n){
num[0] = num1;
goto label1;
}
//输入数字和进制数相等时,不需要计算,直接将1装入数组中,等待label1处理
else if (num1 == n){
num[0] = 1;
goto label1;
}
//预计算新生成的数组有多长,利用tmp防止原数据被修改
while(tmp /= n){
i++;
}
//根据规律,利用商余法求得各位数字,并倒序存到数组中
for (int j = i - 1; j >= 0 ; j--) {
num[j] = num1%n;
num1 = num1/n;
}
label1:
//对数组中大于10的数字进行替换,由于最高到16进制,所以只需要替换到15
//此时数组存储的都为数字字符,即0~f的ascii
for (int k = 0; k < i; k++) {
switch (num[k]) {
case 10:
num[k] = 'a';
break;
case 11:
num[k] = 'b';
break;
case 12:
num[k] = 'c';
break;
case 13:
num[k] = 'd';
break;
case 14:
num[k] = 'e';
break;
case 15:
num[k] = 'f';
break;
default:
//计算字符1和数字1的ascii差值,加给原数进行转换
num[k] = num[k] + ('1' - 1);
break;
}
}
printf("此数转换为%d进制后为:",n);
//遍历输出,因为已经转换成字符,所以使用%c
for (int k = 0; k < i; k++) {
printf("%c",num[k]);
}
printf("\n");
}
int main(int argc, const char * argv[]) {
int num1,n;
printf("请输入一个十进制数:\n");
scanf("%d",&num1);
printf("转换为几进制?\n");
scanf("%d",&n);
transNum(num1,n);
return 0;
}