黑马程序员-c语言回顾-进制

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

C语言回顾-进制

一、计算机中的进制

1、什么是进制

是一种计数的方式,数值的表示形式。

2、常见的进制

十进制、二进制、八进制、十六进制。

3、进位方法


1)十进制

0~9十个数字,逢十进一


2)二进制

0和1  逢二进一

书写形式:0b或者0B开头,比如0b01 。


3)八进制

0~7八个数字  逢八进一

书写形式:数字前面加0,如045


4)十六进制

0~9十个数字加上A、B、C、D、E、F  逢十六进一

书写形式:前面加0x或者0X,如0x45


二、进制转换的要素

1、进制转换的要素

进制转换有3个基本要素:数位、基数和位权。

1)数位:数码在一个数中所处的位置。

2)基数:是几进制,基数就是几。

3)位权:某一位表示的十进制数的值。

位权=数码*基数^数位


2、常见的进制转换

1)10进制转2进制

方法:

整数部分采取“除2取余法”,小数部分采取“乘2取整法”,高位补0。

将得到的余数倒序得到的序列就是二进制表示形式。

2)二进制转十进制

二进制各位位权相加


3)二进制转十六进制

把一个二进制数,整数部分从右向左,四位合成一位,小数部分从左向右,四位合成一位。

如:

二进制:100010100101.1111

二进制:1000  1010  0101. 1111

十六进制:8       A       5    .     F


4)十六进制转二进制

十六进制的每一位拆成4位二进制


三、机器数和真值

1、机器数:

一个数在计算机中的二进制表示形式,叫做这个数的机器数。

机器数是带符号的,在计算机中用一个数的最高位存放符号,正数为0,负数为1 。

2、真值

带符号的机器数对应的真正数值。

因为第一位是符号位,所以机器数的形式值就不等于真正的数值。


四、原码、反码、补码

1、基本概念

对于一个数,计算机要使用一定的编码方式进行存储,原码、反码、补码是机器存储一个具体数字的编码方式。

数据在计算机内部是以补码的形式存储的。

数据分为有符号数和无符号数。

无符号数都是正数,有十进制直接转换成二进制直接存储。(正数的原码、反码、补码相同)

有符号数在计算机内部是以补码的形式存储的。


1)原码

原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。

2)反码

正数的反码是其本身

负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

3)补码

正数的补码是其本身。

负数的补码是在其原码的基础上,符号位不变,其余各位取反,再加1。(在反码的基础上+1)


2、-1在内存中存储细节

-1原码:1000 0000 0000 0000 0000 0000 0000 0001

-1反码:1111  1111 1111  1111  1111 1111    1111 1110

-1补码:1111  1111 1111  1111  1111 1111    1111 1111


正整数取反再+1就是对应的负数。


3、为什么要引入反码和补码?

1)引入补码,计算机能够做减法,减法的电路设计简单。

2)解决了-0的问题。

3)符号位为1,其余各位全是0表示这个字节能表示的最小的负数。

例如:一个字节

1111 1111  表示-127

1000 0000 表示-128


五、位运算符

1、位运算符介绍

位运算符是指按二进制进行的运算符。

C语言提供了6个位操作运算符。

这些位运算符只能用于整型操作数,即只能用于带符号或无符号的char、short、int与long类型。


1)& 按位与

只有对应的两个二进制位均为1是,结果位才是1,否则为0 。

口诀:同1为1 。


2)|  按位或

如果对应的两个二进制位有一个为1,则结果为1,全都是0结果是0 。


3) ~ 按位取反:

1变0,0变1 。


4) ^  按位异或

相同为0,不同为1 。

一个数异或同一个数两次,结果不变。


5)<< 左移

各二进制位全部左移n位,高位丢弃,低位补0 。

向左移动n位,相当于原数乘以2的n次方。

左移可能会改变数的正负性。


6)>>右移

各二进制位全部右移n位,低位丢失,高位补符号位。

向右移动n位,相当于原数除以2的n次方。

右移,不会改变数的正负性。


思考&实现

写一个函数把一个十进制数按照二进制格式输出


#include <stdio.h>
void tenToTwo(int n){
    int temp ;
    int len = sizeof(n)*8;
    for (int i =0; i<len; i++) {
        temp = n;
        temp = temp>>(len-1-i);
        temp = temp&1;
        printf("%d",temp);
    }
    printf("\n");
}
int main(int argc, const char * argv[]) {
    tenToTwo(13);
    return 0;
}


思考&实现

1)判断一个数的奇偶性

void jiOu(int n){
    if (n&1) {
        printf("奇数\n");
    } else {
        printf("偶数!\n");
    }
}



2)交换两个变量的值,不通过第三个变量

用异或

   

void jiOu(int n){
    if (n&1) {
        printf("奇数\n");
    } else {
        printf("偶数!\n");
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值