C语言入门指南:操作符(一)

一、知识铺垫:

今天呢,要介绍操作符的一部分知识,操作符中一些操作符与二进制有关系,所以我们先铺垫一下关于进制的知识

 

 

1.二进制与进制转换

在生活中,我们似乎听过二进制这个词,那这个二进制到底是什么意思呢?

 

1.1 进制的含义及特点

其实啊,所谓二进制,甚至8进制、16进制只是数值的不同表现形式而已比如:

15的2进制1111
15的8进制17
15的10进制15
15的16进制F

(16进制的数值前要写0x    8进制数值前要写0)

我们先从10进制入手,由此来介绍进制,我们日常生活中使用的数字都是10进制的,我们清楚明白10进制的以下特点:

•   10进制中满10进1
•   10进制的数字每⼀位都是0~9的数字组成

 

其实其他进制也是类似的两个特点

进制特点
2进制

满2进1

每一位由0~1组成

8进制

满8进一

每一位由0~7组成

16进制

满16进一

每一位由0~9  a~f组成

其中a~f可看作10~15

 

1.2 进制转换

929的10进制是九百二十九,  为什么是这个值呢?这个问题似乎有些奇怪,小学时便学过数位 个十百千万  ,这些个位、⼗位、百位....都是由权重的,分别每⼀位的权重是  10^0, 10² , 10³ ...

可以这样理解权重:

 百位十位个位 
10进制的权123 
权重10^210^110^0 
权重值100101 
求值1*100           +       2*10         +             3*1            =123

 

2进制的规则类似:

123二进制的数值为1101,可以这样来理解

2进制的位1101 
权重2^32^22^12^0 
权重值8421 
求值1*8                        +1*4                        +0*2                              +1*1=  123

8进制   16进制以此类推即可

 

1.2.1 10进制与二进制的转换

以125为例,将125转换为二进制:

 

1.2.2   2进制转8进制 16进制

 

2进制转8进制

从2进制序列中右边低位开始向左每3个2进制位会换算⼀个8进制位,剩余不够3个2进制位的直接换算。
 

 

以2进制01101011 为例:

 21421421
2进制01101011
8进制2*0+1*1=11*4+0*2+1*1=50*4+1*2+1*1=3

8进制表示的时候前面加0,所以换成8进制为 0153

 

2进制转16进制

2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算。
 
 
 
以2进制01101011为例:
 84218421
2进制01101011
16进制8*0+4*1+2*1+1*0=68*1+4*0+2*1+1*1=b(看作11)
16进制表示的时候前面加0x,所以换成16进制为0x6b

 

 

2 原码  反码  补码

 

2.1 基本知识

整数的2进制表⽰⽅法有三种,即原码、反码和补码
有符号整数的三种表⽰⽅法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号
位,剩余的都是数值位。
符号位都是⽤0表⽰“正”,⽤1表⽰“负”。
 
 
 
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。

 

 2.2 三者关系

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
补码得到原码也是可以使⽤:取反,+1的操作。
 
 
对于整型来说:数据存放内存中其实存放的是补码

为什么呢?

在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀ 处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

 

二、操作符的分类

算术操作符+  -   *  /  %
移位操作符<<      >>
位操作符&     |    ^    
赋值操作符=   +=   -=   *=   %=   <<=   >>=   &=   |=    ^=
单目操作符!  ++   --   &   *   -   +   ~   sizeof   (类型)
关系操作符>   >=   <   <=   ==   !=
逻辑操作符&&   ||
条件操作符?   :
逗号操作符,
下标引用[ ]
函数调用()
结构成员访问
 .    、  ->

 

本次将介绍一部分的操作符

 

三、移位操作符

<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。
 
 
 

1. 左移操作符

移位规则:左边抛弃,右边补0

演示:

#include <stdio.h>
int main()
{
    int num = 10; 
    int n = num<<1; 
    printf("n = %d\n",n);
    printf("num = %d\n",num);
    return 0;
}
 
 

2.右移操作符

移位规则:⾸先右移运算分两种:
1. 逻辑右移:左边⽤0填充,右边丢弃
2. 算术右移:左边⽤原该值的符号位填充,右边丢弃
 
演示:
#include <stdio.h>
int main ()
{
   int num = 10 ;  
   int n   = num>>1;
   printf("n = %d\n", n);
   printf("num = %d\n", num);
  return 0;
}

                                                                 逻辑右移1位演示

 

                                                                 算术右移1位演示

 

位左移n位,相当于右操作数乘于2的n次幂

位右移n位,相当于右操作数整除于2的n次幂

 

警告⚠️:对于移位运算符,不要移动负数位,这个是标准未定义的。
 
 
 
 
 

四、位操作符

 

1.介绍

 

位操作符有:

&按位与
|按位或
^按位异或
~按位取反

注意:他们的操作数必须是整数

 

而这位与 位或 是是怎么个回事呢?

首先这些操作符,运行的是二进制

把这两个数转化位二进制

&位与: 规则就是  两边同为1则为1,否则为0

|位或 : 规则就是  两边有1则为1,否则位0

 

^位异或:两边相同则为0,不同则为1

而这~:   就是按位取反,数位值为1,结果为0,值为0,结果为1

 

代码演示:

#include <stdio.h>
int main ()
{
  int num1 =  3;
  int num2 =  5;  
  
  printf("%d\n", num1 & num2);
  printf("%d\n", num1 | num2);
  printf("%d\n", num1 ^ num2);
  printf("%d\n", ~0);
  return 0;
}

2.经典例题

不能创建临时变量(第三个变量),实现两个整数的交换。

#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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值