c语言操作符(上)


目录

​编辑

原码、反码、补码

1、正数

2、负数

3、二进制计算1-1

移位操作符

1、<<左移操作符

2、>>右移操作符

位操作符&、|、^、~

1、&按位与

2、|按位或

3、^按位异或

特点

4、~按位取反


原码、反码、补码

1、正数

原码 反码 补码相同,最高位为符号位,0正1负

例:10的原码 反码 补码如下(32位二进制表示)

00000000000000000000000000001010 原码 反码 补码

2、负数

原码 变 反码:符号位不变,其他位取反

反码 变 补码:反码+1

其中 原码和补码的相互转换方法一致 符号位不变,其他位取反,再+1

例:-10的原码 反码 补码如下

10000000000000000000000000001010 原码

11111111111111111111111111110101 反码

11111111111111111111111111110110 补码

3、二进制计算1-1

我们都知道1-1=1+(-1)=0,计算机计算是利用补码的

00000000000000000000000000000001 1的原码

10000000000000000000000000000001 -1的原码

11111111111111111111111111111110 -1的反码

11111111111111111111111111111111 -1的补码

1和-1的补码相加得

100000000000000000000000000000000 33位,多的一位向左边移动

00000000000000000000000000000000 1-1的结果 0

移位操作符

注意:1.操作数只能是整数, 移动的是补码

2.不能移动负数位(如n>>-1)

1、<<左移操作符

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

如图将n=10左移1位,以下展示左移细节

0 0000000000000000000000000001010 n 10(补码)

0 0000000000000000000000000001010 左移之后

00000000000000000000000000010100 m 20 左边的0舍弃,右边补0

2、>>右移操作符

移位规则:有逻辑右移算数右移两种

1.逻辑右移:左边补0,右边丢弃

如图将n=10逻辑右移1位,以下展示右移细节

00000000000000000000000000001010 n 10(补码)

00000000000000000000000000001010 右移之后

0 0000000000000000000000000000101 m 5 左边补0,右边的0舍弃

2.算数右移:左边用原符号位填充,右边丢弃( VS中默认算数右移**)**

如图将n=10算数右移1位,以下展示右移细节

11111111111111111111111111110110 n -10(补码)

11111111111111111111111111110110 右移之后

1 1111111111111111111111111111011 m 5 左边补1,右边的0舍弃

位操作符&、|、^、~

注意:操作数只能是整数, 操作的都是二进制位

1、&按位与

运算规则:补码对应的二进制位进行" "运算,即有0则为0,同为1则为1 ,可以理解为乘法

如图将a&b,以下展示细节

00000000000000000000000000000011 a 3的补码

11111111111111111111111111111011 b -5的补码

00000000000000000000000000000011 c a&b的补码

00000000000000000000000000000011c的原码 3

2、|按位或

运算规则:补码对应的二进制位进行" "运算,即有1则为1,同为0则为0 ,可以理解为加法

如图将a|b,以下展示细节

00000000000000000000000000000011 a 3的补码

11111111111111111111111111111011 b -5的补码

11111111111111111111111111111011 c a|b的补码

10000000000000000000000000000101c的原码 -5

3、^按位异或

运算规则:补码对应的二进制位进行"异或 "运算,即相同为0,相异为1

如图将a^b,以下展示细节

00000000000000000000000000000011 a 3的补码

11111111111111111111111111111011 b -5的补码

11111111111111111111111111111000 c a^b的补码

10000000000000000000000000001000c的原码 -8

特点

a^a=0

a^0=a

4、~按位取反

运算规则:补码对应的二进制位进行"取反 "运算,即1变为0,0变为1

如图b=~a,以下展示细节

00000000000000000000000000000001 a 1的补码

11111111111111111111111111111110 b ~a的补码

10000000000000000000000000000010b的原码 -2

相关推荐
传奇开心果编程7 小时前
【Rust入门练中学】 第3课:数据类型
开发语言·学习·rust
泡泡鱼(敲代码中)8 小时前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
Tairitsu_H9 小时前
[C++] 拷贝构造还是赋值重载?类默认成员函数细节详解
开发语言·c++·类和对象
goodlook01239 小时前
opencode调用本地模型一(1.18.30版本安装)
开发语言
Logic1019 小时前
C语言/数据结构贪心算法题解:买卖股票的最佳时机——一次交易最大利润(O(n)时间O(1)空间)
c语言·数据结构·贪心算法·数组·时间复杂度·算法题·股票交易
Logic1019 小时前
C语言/数据结构位运算题解:异或XOR找出货币交易中的“独特面值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
菜鸟~noob2339 小时前
【电子战】第14篇:TOA 定位——圆交汇与到达时间【含matlab代码】
开发语言·matlab
itmigrate10 小时前
Redis 开发高频隐形踩坑记录
开发语言·java-ee
白远山10 小时前
本地游戏代练源码开发实战:架构设计与核心功能实现指南
java·开发语言·架构·需求分析
aramae11 小时前
Python 使用库:标准库与第三方库实战
服务器·开发语言·windows·python