其他分享
首页 > 其他分享> > 光天化日学C语言(17)- 位运算 ~ 的应用 | 0 变 1、1 变 0

光天化日学C语言(17)- 位运算 ~ 的应用 | 0 变 1、1 变 0

作者:互联网

????博客主页:https://blog.csdn.net/WhereIsHeroFrom
????欢迎各位 ????点赞 ⭐收藏 ????评论,如有错误请留言指正,非常感谢!
????本文由 英雄哪里出来 原创,转载请注明出处,首发于 ???? CSDN ????
作者的专栏:
  ????C语言基础专栏《光天化日学C语言》
  ????C语言基础配套试题详解《C语言入门100例》
  ????算法进阶专栏《夜深人静写算法》

文章目录

一、前言

  本文作者是从 2007 年开始学 C语言 的,不久又接触了C++,基本就是 C/C++ 技术栈写了 14 年的样子,不算精通,但也算差强人意。著有《夜深人静写算法》系列,且承诺会持续更新,直到所有算法都学完。主要专攻 高中 OI 、大学 ACM、 职场 LeetCode 的全领域算法。由于文章中采用 C/C++ 的语法,于是就有不少读者朋友反馈语言层面就被劝退了,更何况是算法。
  于是,2021 年 06 月 12 日,《光天化日学C语言》 应运而生。这个系列文章主要服务于高中生、大学生以及职场上想入坑C语言的志同道合之人,希望能给祖国引入更多编程方面的人才,并且让自己的青春不留遗憾!
  这一章的主要内容是取反运算符的应用。

二、人物简介 三、取反运算符
操作数 取反结果
0 1
1 0
#include <stdio.h>
int main() {
    int a = 0b1;
    printf("%d\n", ~a );
    return 0;
}
-2
 ~ 00000000 00000000 00000000 00000001
 --------------------------------------
   11111111 11111111 11111111 11111110

1、补码

正数的补码是它本身,符号位为 0;负数的补码为正数数值二进制位取反后加一,符号位为一;

2、补码举例

 ~ 00000000 00000000 00000000 00000010
 --------------------------------------
   11111111 11111111 11111111 11111101
   11111111 11111111 11111111 11111101
 + 00000000 00000000 00000000 00000001
 --------------------------------------
   11111111 11111111 11111111 11111110

3、补码的真实含义

2^32        = 1 00000000 00000000 00000000 00000000
2^32 - 1    =   11111111 11111111 11111111 11111111
2^32 - 2    =   11111111 11111111 11111111 11111110
...
四、取反运算符的应用

1、0 的取反

【例题1】0 的取反结果为多少呢?

 ~ 00000000 00000000 00000000 00000000
 --------------------------------------
   11111111 11111111 11111111 11111111

1)有符号整型

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

2)无符号整型

#include <stdio.h>
int main() {
    printf("%u\n", ~0 );
    return 0;
}
4294967295

2、相反数

【例题2】给定一个int类型的正数 x x x,求 x x x 的相反数(注意:不能用负号)。

#include <stdio.h>
int main() {
    int x = 18;
    printf("%d\n", ~x + 1 );
    return 0;
}
-18

3、代替减法

【例题3】给定两个int类型的正数 x x x 和 y y y,实现 x − y x - y x−y(注意:不能用减号)。

#include <stdio.h>
int main() {
    int a = 8;
    int b = 17; 
    printf("%d\n", a + ~b + 1 );
    return 0;
}
-9

4、代替加法

【例题4】给定两个int类型的正数 x x x 和 y y y,实现 x + y x + y x+y(注意:不能用加号)。

#include <stdio.h>
int main() {
    int x = 18;
    int y = 7; 
    printf("%d\n", x - ~y - 1 );
    return 0;
}
25

通过这一章,我们学会了:
  1)按位取反运算符;
  2)补码的运算;
  3)有符号整型和无符号整型;
  4)相反数、加法、减法、等于判定的另类解法;


课后习题


????博客主页:https://blog.csdn.net/WhereIsHeroFrom
????欢迎各位 ????点赞 ⭐收藏 ????评论,如有错误请留言指正,非常感谢!
????本文由 英雄哪里出来 原创,转载请注明出处,首发于 ???? CSDN ????
作者的专栏:
  ????C语言基础专栏《光天化日学C语言》
  ????C语言基础配套试题详解《C语言入门100例》
  ????算法进阶专栏《夜深人静写算法》

标签:11111111,光天化日,17,int,32,补码,取反,C语言,00000000
来源: https://blog.51cto.com/u_15239535/3009727