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

前言

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

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

目录

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.hqwc.cn/news/467051.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python-matplotlib绘制双(多)y轴图像

一&#xff1a;灵感问题&#xff08;难点&#xff09; 在利用python中的matplotlib绘制双y轴图像&#xff08;条形图折线图&#xff09;过程中&#xff0c;为了防止折线图被条形图遮挡&#xff0c;我们需要先绘制条形图&#xff0c;而后绘制折线图&#xff0c;大致效果图如下&a…

首次安装Mysql数据库

1、在mysql官网下载自己需要的版本 2、选择安装类型 3、 检查一下需求版本 4、 这里可能会弹出如下信息&#xff0c;先不用管这一步&#xff0c;点击Yes继续即可 5、 安装需要的环境&#xff0c;点击执行就可以&#xff0c;此过程会比较慢 如下就是全面安装完成了&#xff0c;点…

《Linux 简易速速上手小册》第8章: 安全性与加固(2024 最新版)

文章目录 8.1 防火墙与安全策略8.1.1 重点基础知识8.1.2 重点案例&#xff1a;配置 iptables 以保护 Web 服务器8.1.3 拓展案例 1&#xff1a;使用 firewalld 配置动态防御区域8.1.4 拓展案例 2&#xff1a;配置 ufw 以简化管理 8.2 SSH 安全最佳实践8.2.1 重点基础知识8.2.2 重…

从基建发力,CESS 如何推动 RWA 发展?

2023 年 11 月 30 日&#xff0c;Web3 基金会&#xff08;Web3 Foundation&#xff09;宣布通过 Centrifuge 将部分资金投资于 RWA&#xff08;Real World Assets&#xff0c;真实世界资产&#xff09;&#xff0c;试点投资为 100 万美元。Web3 基金会旨在通过支持专注于隐私、…

可视化工具:将多种数据格式转化为交互式图形展示的利器

引言 在数据驱动的时代&#xff0c;数据的分析和理解对于决策过程至关重要。然而&#xff0c;不同的数据格式和结构使得数据的解读变得复杂和困难。为了解决这个问题&#xff0c;一种强大的可视化工具应运而生。这个工具具有将多种数据格式&#xff08;包括JSON、YAML、XML、C…

每日一题 (不用加减乘除做加法,找到数组中消失的数字)

不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com) 可以使用位运算符实现两个整数的加法&#xff1a; 在二进制加法中&#xff0c;我们通常使用“逐位相加”的方法来模拟常规加法的过程。当两个数字进行加法运算时&#xff0c;从最低位&#xff08;通常是右侧&#xff09;开…

Roop的安装教程

roop插件的安装&#xff0c;并不容易 并且最好就是在电脑本地完成&#xff0c;因为涉及到C、visual studio软件&#xff0c;并且还需要在电脑本地放置一些模型&#xff0c;用autoDL其实也有镜像&#xff0c;但是需要数据扩容至少100G&#xff0c;烧钱。。。 电脑本地&#xff0…

000——对i.MAX6uLL进行开箱检查

目录 00外观检查 01有线网卡检查 02USB-host测试 03耳机测试 04按键测试 05查看CPU温度 00外观检查 看起来没什么问题&#xff0c;买了半年了刚开始要做 01有线网卡检查 开机启动正常&#xff0c;韦东山老师还写了个欢迎界面&#xff0c;这个我后面因为要用于毕业设计&am…

一、Docker/安装包部署ClickHouse

Docker/安装包部署ClickHouse 一、docker部署1.安装Docker2.拉取ClickHouse镜像2.1 选择拉取版本2.2 拉取镜像 3.启动ClickHouse3.1 确定好挂载目录3.2 测试环境3.3 生产环境3.1.1 获取配置文件3.1.2 配置文件中添加用户3.1.3 启动容器 4.使用DBeaver连接 二、安装包安装1.准备…

Python基于大数据的电影预测分析系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Linux:搭建docker私有仓库(registry)

当我们内部需要存储镜像时候&#xff0c;官方提供了registry搭建好直接用&#xff0c;废话少说直接操作 1.下载安装docker 在 Linux 上安装 Docker Desktop |Docker 文档https://docs.docker.com/desktop/install/linux-install/安装 Docker 引擎 |Docker 文档https://docs.do…

PKI - 借助Nginx实现_客户端使用CA根证书签发客户端证书

文章目录 Pre概述步骤1. 创建根证书2. 生成客户端证书3. 准备客户端证书扩展文件4. 签发客户端证书5. 配置Nginx5. 重启 Nginx6. 测试 SAN 证书扩展案例&#xff1a;使用IP访问 Pre PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证 PKI - 数字签名与数字证书…