介绍一下位操作符(c基础)

位操作符(只适用整数,针对2进制)

& 且(1 1 为 1 .其余为0)

| 或 (0 0 为 0.其余为1 )

^ 亦或 (相同为0,相异为1)

((满足交换律))

对补码进行& | ^

整数储存形式 补码形式

int型整数占4个字节,一个字节是8位,总共32位

  1. 确定符号位

    • 对于 32 位整数,最高位(最左边那一位)被用作符号位。
    • 符号位为 0 表示正数,符号位为 1 表示负数。
  2. 原码表示

    • 先将整数按照绝对值大小转换成二进制形式,这就是原码。
    • 例如,整数+5的原码为00000000 00000000 00000000 00000101(这里为了方便展示,将 32 位分成了 4 个字节,每个字节 8 位来写);整数-5的原码为10000000 00000000 00000000 00000101
  3. 反码表示(针对负数)

    • 如果是负数,在原码的基础上,除符号位外,其余各位按位取反,得到反码。
    • 例如,-5的反码为11111111 11111111 11111111 11111010
  4. 补码表示(针对负数)

    • 负数的反码加 1 就得到补码,这就是该负数在内存中的存储形式。
    • 例如,-5的补码为11111111 11111111 11111111 11111011,计算机内存中存储-5时实际存的就是这个补码形式。
    • 而正数的补码和原码相同,所以+5在内存中存储的就是其原码00000000 00000000 00000000 00000101

& 就是对补码进行挨位比较(1 1 为 1 .其余为0)

| 就是对补码进行挨位比较(0 0 为 0.其余为1 )

^ 就是对补码进行挨位比较(相同为0,相异为1)

小性质

a ^ a = 0

0 ^ a = a

a ^ b ^ a = b(满足交换律)

证明 a ^ b ^ a = a ^ a ^ b = 0 ^ b = b

下面是代码

cs 复制代码
#include<stdio.h>

int main()
{
	//位操作符
	int a = 3;
	int b = 9;

	//a的原码
	//00000000000000000000000000000011
	//a的反码(a是正数,原反补相同)
	//00000000000000000000000000000011
	//a的补码
	//00000000000000000000000000000011
	//b的原码
	//00000000000000000000000000001001
	//b的反码(a是正数,原反补相同)
	//00000000000000000000000000001001
	//b的补码
	//00000000000000000000000000001001

	//对补码进行& | ^

	//&
	int c = a & b;
	printf("c = %d \n", c);
	//& 1 1 为 1 其余为0
	//a的补码
	//00000000000000000000000000000011
	//00000000000000000000000000001001
	//b的补码
	//00000000000000000000000000000001
	//结果1

	// |
	int d = a | b;
	printf("d = %d \n", d);
	//| 0 0 为 0 其余为1
	//a的补码
	//00000000000000000000000000000011
	//00000000000000000000000000001001
	//b的补码
	//00000000000000000000000000001011
	//结果11

	// ^
	int e = a ^ b;
	printf("e = %d", e);
	//^ 相同为0 相异为1
	//a的补码
	//00000000000000000000000000000011
	//00000000000000000000000000001001
	//b的补码
	//00000000000000000000000000001010
	//结果10
	return 0;
}

负数类似

负数最高位为1(最高位即符号为)

只是负数反码是对原码取异(1 0)(最高位仍为1)

负数补码是反码加1

按位取反操作符 ~

作用于一个整数操作数,将该整数的每一位二进制数字进行翻转,即0变为1,1变为0

相关推荐
捷瑞电子工坊2 小时前
嵌入式秋招面经:5大核心模块高频考题与实战避坑总结
c语言·stm32·嵌入式工程师·rtos·通信协议·嵌入式面试
天空'之城3 小时前
C 语言工业级通用组件手写 30:安全内存拷贝组件
c语言·内存拷贝·工业级组件·安全内存操作
LuminousCPP5 小时前
数据结构-双向循环链表
c语言·数据结构·笔记·链表
小僧景贤7 小时前
嵌入式C语言 第二篇:基础语法|嵌入式C与标准C的核心差异
c语言·开发语言·嵌入式c语言
wuyk5559 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
LuminousCPP10 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
带鱼吃猫11 小时前
预处理器:宏、运算符与条件编译
c语言·开发语言
(Charon)11 小时前
【C++】线程安全队列(二):生产者消费者模型与 condition_variable 阻塞等待
c语言·开发语言·c++
SunnyByte12 小时前
排序进阶:快速排序与归并排序的迭代实现,并与递归版本对比
c语言·数据结构·算法·排序算法
wuminyu13 小时前
JDK21解决虚拟线程IO阻塞原理剖析
java·linux·c语言·jvm·c++