C/C++学习笔记:按位运算基本知识及用法介绍

/*
 按位运算,见 C Primer Plus 中文第六版 第497页 
 
补码的概念:
在补码表示中,最高位为符号位,正数的符号位为0,负数为1
补码的规定如下:
对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。
对负数而言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。如-42的补码为11010110(00101010按位取反11010101+1即11010110)
用补码来表示数,0的补码是单一的,都为00000000。(而在原码,反码表示中,+0和-0的表示是不单一的)。而且可以用111111表示-1的补(这也是补码与原码和反码的区别)。

 1、二进制反码或按位取反:~
 将1变为0,0变为1,例如:
 ~(10011010)计算之后得:
  (01100101) 

2、按位与:&
二元运算符&通过逐位比较两个运算对象,生成一个新值,对于每个相应的位,都为1时,结果才为1
例如: 
    (10010011)
   &(00111101)
-----------------
ans: 00010001
按位与运算符合计算后不再改变的变化规律:a & b & a = b & a & a

3、按位或:|
二元运算符按位或|,通过比较两个运算对象,生成一个新值,对于相应的位存在1,那么值为1
例如: 
    (10010011)
   |(00111101)
-----------------
ans: 10111111
按位或运算符合计算后不再改变的变化规律:a | b | a = b | a | a

4、按位异或:^
二元运算符按位异或^,逐位比较两个运算对象,对于一个相应位,如果只有一个1,那么值为1,否则值为0;
可以理解为:无进位相加,即不考虑进位的时候将对应值相加
例如: 
    (10010011)
   ^(00111101)
-----------------
ans: 10101110
异或运算符合交换律和结合律:
a ^ b = b ^ a;
a ^ a = 0;
0 ^ a = a;
a ^ b ^ a = b ^ a ^ a = b;
因此通常用来交换两个变量的值:例如交换a和b的值,我们可以这样计算:
a = a ^ b;
b = a ^ b;
a = b ^ a;
*/

/* 
常用算法之提取二进制中最右侧的1:
例如 获取 二进制数 010010101000 中最右侧的1,即获得 000000001000
解法:利用公式 a&(~a+1)即可 公式中的&和~都是按位运算符
a=           010010101000
~a=          101101010111
~a+1=        101101011000
b=a&(~a+1)=  000000001000
因此,按照此规律,可以处理原数的倒数第二个1:
a'=a-b=      010010100000
....周而反复,可以提取每一个1
*/

/* 
常用算法之 一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到这一个数:
例如 112222333344444444555 中5只出现了一次,则利用
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碧波bibo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值