位运算

【转载】原文:https://blog.csdn.net/BIGBIGPPT/article/details/88919783


基本介绍

位运算是在二进制中的运算方式,所有其他进制的数在进行位运算时都要先转化成二进制数再进行运算。
位运算主要包括按位与(&)、按位或(|)、按位异或(^)、取反( ~ )、左移(<<)、右移(>>)这几种。
其中除了取反( ~ )以外,其他的都是二目运算符,即要求运算符左右两侧均有一个运算量。

按位与(&)

运算的两个数,转换算为二进制后,进行与(&)运算。
当相应位上的数都是1时,该位取1,否则该为0。

例如: 5 & -5
5  : 0000 0000 0101
-5 : 1111 1111  1011
答案 : 0000 0000 0001

按位或(|)

运算的两个数,转换为二进制后,进行或(|)运算。
只要相应位上存在1,那么该位就取1,如果都不为1,就为0。

还是5 | -5
0000 0000 0101
1111 1111 1011
可以看到每一位中其中一个都有1
答案 :1111 1111 1111

按位异或(^)

运算的两个数,转换成二进制数后,进行异或(^)运算
如果相应位置上的数相同,该位取0,如果不同改位取1。

5 ^ -2
0000 0101
1000 0010
——————
1000 0111
对应10进制数-7

同时任何数异或0都是其本身,一个数如果异或自己则等于0
这样我们可以用异或来交换两个数的值

比如交换x,y的值
x ^= y; x = x ^ y
y ^= x; y = y ^ x ^ y
x ^= y; x = ( x ^ y ) ^ (y ^ x ^ y) ; ————>最后一步 x ^= y 时 x = x ^ y; y = y ^ x ^ y

取反(~)

其实在说补码的是后,取反就已经说了,就是将取反的数在二进制下的每一位取相反的数

5:   0000 0101
~5 :1111 1010     ——> 对应十进制数250

左移(<<)

将一个数二进制下的数向左移若干位,
比如 x << y 就是将二进制下的x 向左移 y 位

例 : 5 << 2
5 :         0000 0101
5 << 2 : 00010100
在10进制下就等于20

我们可以思考一下,在十进制中,一个数每乘一次10就向左进一位。
那么在二进制中,同10进制一样,二进制中每乘一次2就向左进一位,
那么一个数左移x 就等价于一个数乘 2x。

右移(>>)

将一个数在二进制下右移若干位,与左移用法相同

例 20 >> 2
20:         00010100
20 >> 2 :00000101

在10进制下就等于5

这里与左移类似,十进制下每除10整数位就退一位
那么右移就等价于除了几次2
同时右移运算是向下取整的

应用

1.判断一个数的奇偶性

奇数和偶数转化为二进制的区别:奇数最后一位是1,偶数最后一位是0
按位与:两个操作数对应位同为1时,该位取1,否则取0
1的二进制:最后一位为1,其余位全为0
因此,将数值与1做"按位与"运算。若结果是1,则为奇数,若结果为0,则为偶数。
例如:

00101010   |   40
00000001   |    1
————————
00000000   |    0        ——> 40与1按位与结果为0,40是偶数

00010001   |    17
00000001   |    1
————————
00000001   |    1       ——> 17与1按位与结果为1,17是奇数

2.交换两个int类型变量的值

交换变量x,y的值:

步骤:
1、x = x^y
2、y = x^y
3、x = x^y
例如:
x=4;    00000100
y=8;    00001000

1.x=x^y
00000100    
00001000
————————
00001100   |  x

2.y=y^x
00001000
00001100
————————
00000100   |  y=4       

3.x=x^y
00001100
00000100
————————
00001000   |  x=8

总结:(x^y)((x^y)^y)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值