【C语言】符号的深入理解(第二期)

简介: 上期我们讲到过逻辑或和逻辑与,他们得到的结果是真假值,但我们一定要区分清楚,按位运算符 "|" 和 "&" 与逻辑运算符 "||" "&&" 是完全两个概念。

1、按位运算符

1.1 按位或 ( | ) 和 按位与 ( & )

上期我们讲到过逻辑或和逻辑与,他们得到的结果是真假值,但我们一定要区分清楚,按位运算符 "|" 和 "&" 与逻辑运算符 "||" "&&" 是完全两个概念。


按位,简明之意,按数值二进制位来进行运算,都是在数据补码的基础上进行。

按位或 "|" : 两个数值的二进制补码对应位进行运算,对应位有 1 则为 1 ,否则为 0

按位与"&":两个数值的二进制补码对应位进行运算,对应位都为 1 则为 1, 否则为 0

这里我们举例说明:

1 | 2 :

1 的二进制补码:0000 0000 ... 0000 0001

2 的二进制补码:0000 0000 ... 0000 0010

------按位或结果:  0000 0000 ... 0000 0011   -> 对应十进制:3      

1 & 2:

1 的二进制补码:0000 0000 ... 0000 0001

2 的二进制补码:0000 0000 ... 0000 0010

------按位与结果:  0000 0000 ... 0000 0000   -> 对应十进制:0      



其实有很多大学老师或者是书上都有可能把按位或,按位与,以及后面我们要讲的按位异或,他们会把每位二进制运算后的结果称为或者,其实这样的说法是不够严谨的真假是逻辑判断,而按位运算得到的结果是数值,而且在C语言中0表示假,非0为真,所以我是不推荐这种说法。

1.2 按位异或 ( ^ )  

按位或 "^" : 两个数值的二进制补码对应位进行运算,相同为 0 , 不同为 1

这里我们举例说明:

1 ^ 3 :

1 的二进制补码:0000 0000 ... 0000 0001

3 的二进制补码:0000 0000 ... 0000 0011

---按位异或结果:  0000 0000 ... 0000 0010   -> 对应十进制:2    

5 ^ 0 :

5 的二进制补码:0000 0000 ... 0000 0101

0 的二进制补码:0000 0000 ... 0000 0000

---按位异或结果:  0000 0000 ... 0000 0101   -> 对应十进制:5    

结论:任何数异或0都等于它本身

这里有一道笔试题:不创建临时变量,实现两个数的交换。

//很多小伙伴直接想出来的做法:
int main()
{
    int a = 10;
    int b = 20;
    printf("a = %d, b = %d\n", a, b);
    a = a + b;
    b = a - b;
    a = a - b;
    printf("a = %d, b = %d\n", a, b);
    return 0;
}
相关文章
|
4月前
|
C语言
c语言编程练习题:7-16 计算符号函数的值
请编写程序计算该函数对任一输入整数的值。
82 0
|
4月前
|
C语言 C++ 索引
C语言符号——操作符详解
C语言符号——操作符详解
33 0
C语言符号——操作符详解
|
4月前
|
存储 机器学习/深度学习 自然语言处理
【进阶C语言】编译与链接、预处理符号详解
【进阶C语言】编译与链接、预处理符号详解
51 0
|
4月前
|
C语言
C语言陷阱——无符号数和有符号数的大小比较
C语言陷阱——无符号数和有符号数的大小比较
|
4月前
|
C语言
【C语言】C语言中的符号重载
【C语言】C语言中的符号重载
82 0
|
11月前
|
存储 小程序 程序员
8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
99 0
|
11月前
|
存储 人工智能 编译器
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
375 0
|
算法 编译器 C语言
c语言符号深度理解和再认识(2)
一、注释符号 初步了解一下;/* */这个是c语言风格,//是c++风格。 (一)、注释的本质 首先run代码引入主题
102 0
|
存储 编译器 Linux
c语言符号深度理解和再认识(1)
一、注释符号 初步了解一下;/* */这个是c语言风格,//是c++风格。 (一)、注释的本质 首先run代码引入主题:
111 0
|
机器学习/深度学习 C语言
C语言中常见的符号和注释的用法
C语言中常见的符号和注释的用法
222 0