C语言操作符详解第一讲

移位操作符 (>>右移操作符 <<左移操作符)

右移操作符分为:1.算术右移 (右边丢弃,左边补原符号位)2.逻辑右移(右边丢弃,左边补0)相当于除二操作

左移操作符:左边丢弃,右边补零,左移除二效果

移位操作符只能作用于整数
int main() {
	int a = 16;
	//>> 右移操作符
	//移动的是二进制位
	int b = a >> 1;
	printf("b=%d", b);//b=8
	a = -1;
	b = a >> 1;
	printf("b=%d", b);
	return 0;
	//右移操作符:
	//1.算术右移
	//	右边丢弃,左边补原符号位
	//2.逻辑右移
	//	右边丢弃,左边补零

	//整数的二进制表示有:原码、反码、补码
	//存储到内存的是补码
	//10000000 00000000 00000000 00000001 原码
	//11111111 11111111 11111111 11111110反码
	//11111111 11111111 11111111 11111111补码
	// 1111111 11111111 11111111 111111111 右移一位,左边补原符号位1
}

int main() {
	int a = 5;
	int b = a << 1;
	//00000000 00000000 00000000 00000101
	//0000000 00000000 00000000 000001010
	//左边丢弃,右边补零
	//右移除二效果,左移乘二效果
	printf("b=%d", b);//b=10
	return 0;
}

按位与&、按位或|、按位异或^(同0异1)

int main() {
	int a = 3;
	int b = 5;
	int c = a & b;
	//00000000 00000000 00000000 00000011
	//00000000 00000000 00000000 00000101
	//按位与后得
	//00000000 00000000 00000000 00000001
	printf("c=%d",c);//c=1
	c = a | b;
	//00000000 00000000 00000000 00000011
	//00000000 00000000 00000000 00000101
	//按位或后得
	//00000000 00000000 00000000 00000111
	printf("c=%d", c);//c=7
	c = a ^ b;
	//00000000 00000000 00000000 00000011
	//00000000 00000000 00000000 00000101
	//按位异或后得
	//00000000 00000000 00000000 00000110
	//同零异一
	printf("c=%d", c);//c=6
	return 0;
}

接下来看几道题目吧

代码实现交换两个int值,要求:不能使用第三个变量。

 方法一:加减法(有缺陷,会溢出)

	a = a + b;
	b = a - b;
	a = a - b;

方法二:异或(可读性差,执行效率低)

	//a=3,b=5
    a = a ^ b;
    //011^101=110 
	b = a ^ b;
	//110^101=011 
	a = a ^ b;
	//110^011=101 
	return 0;

实际上我们平时写代码的时候并不会用加减法和异或方法去交换两个数值,最好的方法其实是利用第三个变量tmp来交换

来看第二道题吧

求一个整数存储在内存中得二进制中1的个数

 方法一:模二算法(遇见负数会出现问题)

	while (num)//不等于0说明二进制序列中还有1
	{
		if (num % 2 == 1)
			count++;
		num = num / 2;
	}

方法二:移位+异或

    //例如把3和1异或后得1说明3的二进制序列中最后一位是1
	//00000000 00000000 00000000 00000011
	//00000000 00000000 00000000 00000001
	//00000000 00000000 00000000 00000001
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if (1 == ((num >> i) & 1)){
			count++;
		}
	}
}

下面了解一下单目操作符有哪些吧

 !  -  +  &  sizeof  ~ (对一个数的二进制按位取反) --  ++  *   ()强制类型转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值