那些也许你不知道的操作符!

article/2024/2/25 20:53:18

前言

操作符有很多种,目前我们已经了解了一部分

例如最简单的+、-、*、/、=,还有我们学到的&&,||,!等,但是操作符可不是就只有这么些的,让我们一起来看看吧

目录

1. 移位操作符

原码、反码、补码

1.1 <<左移操作符

1.2 >>右移操作符

2. 位操作符

&按位与

|按位或

^按位异或

~按位取反

3.整型提升


1. 移位操作符

在学习移位操作符前要对二进制有一定的了解

原码、反码、补码

整数的二进制表示方法有三种,分别是原码、反码、补码

原码:直接将正负数按照二进制的形式翻译得到的就是原码

反码:符号位不变,其他位依次按位取反即可(0变1,1变0)

补码:反码 + 1 得到补码

整型int占4个字节,所以一共有32个bit位,可以存放32个0或1

第一个bit位是符号位,如果整数为正,符号位是0,整数为负,符号位是1,剩下的31个bit位正常存放

正整数的原码、反码、补码都是相同的,为原码

例如:整数-5

5转换为二进制为:101,那么它的原码就是:10000000 00000000 00000000 00000101
反码符号位不变,其他按位取反:11111111 11111111 11111111 11111010
补码为反码 + 1 ,11111111 11111111 11111111 11111011

原码取反加1能得到补码,补码也能取反加1得到原码哦

小知识:计算机在内存中对于数据的存储其实存放的都是补码

1.1 <<左移操作符

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

#include <stdio.h>int main()
{int num = 5; //00000000 00000000 00000000 00000101int n = num << 1; //00000000 00000000 00000000 00001010printf("%d", n);return 0;
}
输出结果:10

 这里面其实有个规律,如果我们再次使用左移操作符,得到的为20,再一次得到的是40

#include <stdio.h>int main()
{int num = 5; //00000000 00000000 00000000 00000101int t = 3;while (t--) //t为循环次数{num = num << 1;printf("%d ", num);}return 0;
}

 

从5到10到20到40,我们可以发现它是以2倍的形式增加的

1.2 >>右移操作符

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

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

这里的规律也是类似

#include <stdio.h>int main()
{int num = 10; //00000000 00000000 00000000 00001010int t = 3;while (t--) //t为循环次数{num = num >> 1;printf("%d ", num);}return 0;
}

 

它是以2为倍数减少的

2. 位操作符

&按位与

规则:将两数补码相比较,有0则0,两者为1才为1,看代码

#include <stdio.h>int main()
{int num1 = 5;   // 5补码:00000000 00000000 00000000 00000101int num2 = -4;	//-4原码:10000000 00000000 00000000 00000100//-4反码:11111111 11111111 11111111 11111011//-4补码:11111111 11111111 11111111 11111100 两者补码按位与// 5补码:00000000 00000000 00000000 00000101//&有0则0:00000000 00000000 00000000 00000100printf("%d\n", num1 & num2); return 0;
}
输出结果:4

最后&出来的结果为补码,原码、反码、补码相同,所以原码结果为4 

|按位或

规则:将两数补码相比较,有1则1,两者为0才为0

#include <stdio.h>int main()
{int num1 = 5;   // 5补码:00000000 00000000 00000000 00000101int num2 = -4;	//-4原码:10000000 00000000 00000000 00000100//-4反码:11111111 11111111 11111111 11111011//-4补码:11111111 11111111 11111111 11111100 两者补码按位与// 5补码:00000000 00000000 00000000 00000101//补码结果:11111111 11111111 11111111 11111101//原码结果:10000000 00000000 00000000 00000011printf("%d\n", num1 | num2); return 0;
}
输出结果:-3

^按位异或

规则:将两数补码相比较,相同为0,相异为1

#include <stdio.h>int main()
{int num1 = 5;   // 5补码:00000000 00000000 00000000 00000101int num2 = -4;	//-4原码:10000000 00000000 00000000 00000100//-4反码:11111111 11111111 11111111 11111011//-4补码:11111111 11111111 11111111 11111100 两者补码按位与// 5补码:00000000 00000000 00000000 00000101//补码结果:11111111 11111111 11111111 11111001//原码结果:10000000 00000000 00000000 00000111printf("%d\n", num1 ^ num2); return 0;
}
输出结果:-7

~按位取反

规则:0变1,1变0

#include <stdio.h>int main()
{printf("%d\n",~1); //1的原码00000000 00000000 00000000 00000001//取反结果11111111 11111111 11111111 11111110//结果原码10000000 00000000 00000000 00000010return 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;
}

 

这里异或我们需要知道,n ^ n = 0 , n ^ 0 = n,上题正是利用了第一个特性

所以我们一个个代入之后就能理解了


http://www.ngui.cc/article/show-1899211.html

相关文章

PMP-情景模拟学习法-识别项目阶段

《指南》和题目中采用了一种默认划分方法&#xff0c;把项目分为&#xff1a;启动、规划、执行和收尾这四个通用阶段。PMP考试和每个问题几乎都是基于特定阶段的情况提出的。 第一&#xff0c;启动阶段&#xff1a;项目章程正式批准之前的时间&#xff0c;可以统称为启动阶段&a…

常见范数介绍

一、在线性代数中&#xff0c;符号 ( ||x|| ) 表示向量 ( x ) 的范数&#xff08;Norm&#xff09;。范数是一个将向量映射到非负值的函数&#xff0c;它衡量了向量的大小或长度。范数可以是多种类型&#xff0c;其中最常见的有&#xff1a; 欧几里得范数&#xff08;L2范数&am…

读书笔记:《人件:PeopleWare》

人力资源 人无法作为固定模块来管理。只有从事基础研究的科研人员才是高科技工作者&#xff0c;普通程序员只是运用研究成果&#xff0c;解决社会问题&#xff0c;而非技术问题。程序员习惯性关注于技术问题&#xff0c;是因为技术问题比社会问题更简单。管理者不喜欢员工的独…

Python学习之路-爬虫提高:selenium

Python学习之路-爬虫提高:selenium 什么是selenium Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;Selenium 可以直接运行在浏览器上&#xff0c;它支持所有主流的浏览器&#xff08;包括PhantomJS这些无界面的浏览器&#xff09…

坚持刷题|重建二叉树

文章目录 题目考察点代码实现实现总结扩展问题从前序和中序遍历中序列构建二叉树题目代码实现与后序实现的异同点 前序和后序可不可以唯一确定一棵二叉树呢&#xff1f; Hello&#xff0c;大家好&#xff0c;我是阿月。坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天刷…

AtCoder Beginner Contest 340 C - Divide and Divide【打表推公式】

原题链接&#xff1a;https://atcoder.jp/contests/abc340/tasks/abc340_c Time Limit: 2 sec / Memory Limit: 1024 MB Score: 300 points 问题陈述 黑板上写着一个整数 N。 高桥将重复下面的一系列操作&#xff0c;直到所有不小于2的整数都从黑板上移除&#xff1a; 选择…

浅析Linux追踪技术之ftrace:Event Tracing

文章目录 概述使用Event Tracing使用set_event接口使用enable接口 Event配置Event formatEvent Filtering过滤规则设置过滤器 Event TriggerTrigger语法 Trace marker相关参考 概述 Event Tracing&#xff08;事件追踪&#xff09;利用在内核代码中加入的各种Tracepoint&#…

C++ 堆排序

C 堆排序 堆排序是一种基于二叉堆数据结构的排序算法&#xff0c;其原理如下&#xff1a; 构建最大堆&#xff1a;将待排序的数组看作一个完全二叉树&#xff0c;并通过调整节点的位置构建一个最大堆。最大堆满足每个父节点的值都大于或等于其子节点的值。构建最大堆的过程可以…

猫头虎分享:Win11系统家庭版组策略编辑器怎么打开? Windows11家庭版没有gpedit.msc如何解决?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

智胜未来,新时代IT技术人风口攻略-第一版(弃稿)

文章目录 抛砖引玉 鸿蒙生态小科普焦虑之下 理想要落到实处校园鼎力 鸿蒙发展不可挡培训入场 机构急于吃红利企业布局 鸿蒙应用规划动智胜未来 技术人风口来临 鸿蒙已经成为行业的焦点&#xff0c;未来的发展潜力无限。作为一名程序员兼UP主&#xff0c;我非常荣幸地接受了邀请…