黑马程序员——C基础——进制、输出控制符和位运算

本文详细介绍了C语言中的二进制、八进制、十进制和十六进制的基本概念及其相互转换方法,并通过实例展示了如何使用C语言中的输出控制符来改变输出格式。此外,还深入探讨了位运算符的用法及其实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-----------android培训java培训、java学习型技术博客、期待与您交流!------------

C语言中整数的常用进制有三种,二进制、八进制、十六进制和十进制。

二进制:

二进制就是数字的每一个位上只能是0和1两个字符,它的表示方法是在数字的前面加上0B或者0b,比如说0B1110代表的就是二进制的数。二进制转换成十进制是怎么转换的呢?它的每个位转换成十进制的值都是:m乘以2的n-1次方,这里m代表这一位上的数字,n代表的是第几位。比如说0B1110这个数字,它转化成十进制就是0*1+1*2+1*2*2+1*2*2*2 = 14。

八进制:

八进制就是数字的每一个位上只能是0~7八个字符,它的表示方法是在数字的前面加上0,比如说0117代表的就是八进制的数。八进制转换成十进制是怎么转换的呢?八进制转换为十进制的方法与二进制转换成十进制的方法类似,只不过它乘上的是8的次方。比如说0117这个数字,它转化成十进制就是7*1+1*8+1*8*8 = 79。

十六进制:

十六进制就是数字上的每一位只能是0~9,a~f(可以是大写)这十六个字符。它的表示方法就是在数的前面加上0x或者0X。十六进制转换为十进制的方法与八进制转换成十进制的方法类似,只不过它乘上的是16的次方。比如说0x21A这个十六进制数字,它转换成十进制就是A*1+1*16+2*16*16=10*1+1*16+2*16*16= 538。

十进制就是我们平常用的数字,比如说21,33这些数字。

下面我们来学习输出控制符。我们常用的输出控制符一般有以下几种:

%d或者%i:代表输出的是十进制的整数。

%o:代表输出的是八进制的整数。

%x::代表输出的是十六进制的整数。

%p:代表输出的是地址。

%c:代表输出的是字符。

%s:代表输出的是字符串。

%f:代表输出的是小数。

下面的代码就是输出控制符的运用:

#include <stdio.h>

int main()
{
    int a = 0x21A;
    printf("按十进制输出是:%d\n", a);
    printf("按八进制输出是:%o\n", a);
    printf("按十六进制输出是:%x\n", a);
    
    char c = 'A';
    printf("按十进制输出是:%d\n", c);
    printf("按字符输出是:%c\n", c);
    
    return 0;
}

输出结果是:

按十进制输出是:538

按八进制输出是:1032

按十六进制输出是:21a

按十进制输出是:65

按字符输出是:A

从输出结果我们可以看出变量a的赋值的确是按照十六进制的复制方式赋值的,而且可以按照其它的进制输出。其中字符变量c我们可以看出它也可以转化为十进制输出,这说明了字符其实也是整型变量。在内存中,字符是按照ASCII码表存储的。字符 'A' 在内存中存储的是65,'a' 在内存中则是97,也就是说大写字母的ASCII值要比小写字母的小32。在ASCII码表中,97到112代表的是小写字母a到z,65到90代表的是大写字母A到Z。

其实我们再给字符变量赋值的时候也可以直接写它的ASCII值。比如 char c = 65; 这就代表了给字符变量的值是 'A' 。

下面我们来学习位运算,位运算分为下面几种:

&:按位与。

|:按位或。

^:按位异或。

~:取反。

<<:左移。

>>:右移。

上面的六种位运算符的前三种都是二目运算符,后面三种是一目运算符。

下面我们在代码中学习位运算:

#include <stdio.h>

// 位运算是把数值转换成二进制后再进行运算的
int main()
{
    int a = 5, b = 6;
    
    /*
     按位与是把数值的二进制形式按对应的位与,只有两个都为1的时候才是1,否则为0。
     a:0101
     b:0110
     -------
     &:0100  6
    */
    printf("按位与的结果是:%d\n", a&b);
    
    /*
     按位或是把数值的二进制形式按对应的位或,只有两个都为0的时候才是0,否则为1。
     a:0101
     b:0110
     -------
     |:0111  7
     */
    printf("按位或的结果是:%d\n", a|b);
    
    /*
     按位异或是把数值的二进制形式按对应的位异或,两个数相等时为0,不相等为1。
     a:0101
     b:0110
     -------
     ^:0011  3
     */
    printf("按位异或的结果是:%d\n", a^b);
    
    /*
     取反是把数值的二进制形式按位取反,位上是1变为0,位上是0变为1,符号位也取反。
     a:0000 0000 0000 0000 0000 0000 0000 0101
     --------------------------------------------
     ~:1111 1111 1111 1111 1111 1111 1111 1010  -6
     */
    printf("取反的结果是:%d\n", ~a);
    
    /*
     左移是把数值的二进制形式按位向左移动n位,高位丢弃,低位补0。下面是把a左移1位
     a: 0000 0000 0000 0000 0000 0000 0000 0101
     --------------------------------------------
     <<:0000 0000 0000 0000 0000 0000 0000 1010  10
     */
    printf("左移的结果是:%d\n", a<<1);
    
    /*
     右移是把数值的二进制形式按位向右移动n位,符号位不变,高位补0,低位丢弃。下面是把a右移1位
     b: 0000 0000 0000 0000 0000 0000 0000 0110
     --------------------------------------------
     >>:0000 0000 0000 0000 0000 0000 0000 0011  3
     */
    printf("右移的结果是:%d\n", b>>1);
    
    return 0;
}

上面的代码和里面的注释就是位运算的概念和做法。

总结:

1、常用进制有二进制、八进制、十进制和十六进制。

2、二进制、八进制和十六进制向十进制转换:每位上都是进制数的位数减1次方。

3、通过输出控制符我们可以控制输出的格式,不同的输出控制符有不同的效果。

4、位运算就是把数字转换成二进制后再进行与或非、左移和右移的运算。左移就是把数字扩大为两倍。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值