【C语言】位操作符的基本使用

*识别位操作符并且牢记其作用

        &  |  ^以如何有1为记忆点

        & 与:补码相同为1则为1,否则为0 // 都为1才1(很难 需要两个1

        | 或:补码有1则为1,否则为0 // 有一个1就1(没这么难 只需要一个1 两个1也行

        ^ 异或:补码相异为1,否则为0 // 不同才1 (很异或 也只需要一个1 但只能有一个1

        ~ 取反:~(1001)结果为0110

        >> 右移:补码右移,缺口补0

        << 左移:补码左移,缺口补0

*按位异或操作符的运用:

       Ⅰ:不使用临时变量交换数字如何实现?

        例:a=100010;b=000101

        a=a^b=100111;

        b=a^b=100010;

        再a=a^b=100010;a对同一个数进行按位异或运算时候,若有改变数,下一次改变的数一定会与前一次不对应,而造成第二改变,而改变只有0和1两种结果,所以最终对变回原来的那个数。

        Ⅱ:两个整数二进制位有几个不同

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = 0;
	c = a ^ b;    //二进制位不同则取1
	int tmp = 0;
	while (c)
	{
		tmp++;
		c = c & (c - 1);     //-1后按位与可以消除一个1 以此来计算1的个数
                             //因为-1后若个位数没有1 则最小的1会变成0而后面的0会变成1
                             //如0011 1000会变成0011 0111 然后按位与的规则会得到0011 0000
                             //即消去了一个1
	}
	printf("输入的两个数二进制位有%d个不同",tmp);
	return 0;
}

富有价值的学习位操作符的题目

        * 求两个数二进制中不同位的个数

        * 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

        * 统计二进制中1的个数

        * 交换两个变量(不创建临时变量)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值