位操作符笔记

位操作符

原码反码补码

一个数字转化为对应的二进制位即为原码(最高位为符号位),内存中存放的都是补码,运算也是通过补码来计算。补码由原码取反加一得到,打印时要将内存中的补码转化为原码打印

& 按(2进制)位与

运算规则:对应的二进制有0则为0,两个同时为1则为1

#include<stdio.h>
//按位与&
//对应的二进制位有0为0,两个都是1则为1
int main(){
	 int a = 3;
	 //00000000 00000000 00000000 00000011
	 int b = -5;
	 //10000000 00000000 00000000 00000101-原码
	 //11111111 11111111 11111111 11111010-反码
	 //11111111 11111111 11111111 11111011-补码

	 int c = a & b;
	 //00000000 00000000 00000000 00000011 -a
	 //11111111 11111111 11111111 11111011 -b
	 //00000000 00000000 00000000 00000011 -c
	 printf("%d", c); //3
}

| 按(2进制)位或

运算规则:对应的二进制有1则为1,两个同时为0则为0

#include<stdio.h>
//按位与|
//对应的二进制位有1为1,两个都是0则为0
int main(){
	 int a = 3;
	 //00000000 00000000 00000000 00000011
	 int b = -5;
	 //10000000 00000000 00000000 00000101-原码
	 //11111111 11111111 11111111 11111010-反码
	 //11111111 11111111 11111111 11111011-补码

	 int c = a | b;
	 //00000000 00000000 00000000 00000011 -a
	 //11111111 11111111 11111111 11111011 -b
	 //11111111 11111111 11111111 11111011 -c(补码)
	 //由于c的符号位是1,打印时要转化为原码打印
	 //10000000 00000000 00000000 00000101 -c(原码)
	 printf("%d", c); //-5
}

^按(二进制)位异或

运算规则:对应的二进制位相同则为0,相异则为1

#include<stdio.h>
//按位异或^
//对应的二进制位相同为0,相异为1
int main(){
	 int a = 3;
	 //00000000 00000000 00000000 00000011
	 int b = -5;
	 //10000000 00000000 00000000 00000101-原码
	 //11111111 11111111 11111111 11111010-反码
	 //11111111 11111111 11111111 11111011-补码

	 int c = a ^ b;
	 //00000000 00000000 00000000 00000011 -a
	 //11111111 11111111 11111111 11111011 -b
	 //11111111 11111111 11111111 11111000 -c(补码)
	 //由于c的符号位是1,打印时要转化为原码打印
	 //10000000 00000000 00000000 00001000 -c(原码)
	 printf("%d", c); //-8
}

^的应用-交换变量

^异或操作符的规则:

  1. a^a=0
  2. 0^a=a
  3. ^支持交换律
  4. a ^ b ^a=b
#include<stdio.h>
//如何在不创建临时变量的情况下交换两个变量的值
int main() {
	int a = 3;
	int b = 5;

	printf("%d %d", a, b);

	a = a ^ b;
	b = a ^ b;
	a = a ^ b;

	printf("%d %d", a, b);
	return 0;
}

不建议使用,可读性差,效率低,且只能交换整数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值