有趣的位操作


前言

位操作是我们在某一部分算法题中使用较多的知识点,由于位操作比较简单,且效率较高,所以今天博主来分享一些有趣的位操作以及一些在算法题中的应用。


位操作基本知识点

我们在算法题中常用的位操作一般有三种,即异或这三种,所以我们先介绍一下基本的用法。

与运算(&)

参加运算的两个数据,按二进制位进行“与”运算。

运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1;

即:两位同时为“1”,结果才为“1”,否则为0

例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值为1。

例如:9&5 即 0000 1001 (9的二进制补码)&00000101 (5的二进制补码) =00000001 (1的二进制补码)可见9&5=1。

或运算(|)

参加运算的两个对象,按二进制位进行“或”运算。

运算规则:0|0=00|1=11|0=11|1=1

即 :参加运算的两个对象只要有一个为1,其值为1

例如: 3|5 可写算式如下: 0000 0011 | 0000 0101 = 0000 0111(十进制为7)因此,3|5的值为7。

例如:9|5 可写算式如下: 00001001 | 00000101 = 00001101 (十进制为13)因此,9|5的值为13。

异或运算(^)

参加运算的两个数据,按二进制位进行“异或”运算。

运算规则:0^0=00^1=11^0=11^1=0

即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0

例如:9^5可写成算式如下: 00001001 ^ 00000101 = 00001100 (十进制为12)因此,9^5的值为12。

几个有趣的位操作

或操作转字母小写

('a' | ' ') = 'a'
('A' | ' ') = 'a'

与操作转字母大写

('b' & '_') = 'B'
('B' & '_') = 'B'

异或操作与空格进行字母大小写转换

('d' ^ ' ') = 'D'
('D' ^ ' ') = 'd'

判断两个数是否异号

int x = -3, y = 2;
boolean f = ((x ^ y) < 0); // true

int x = 3, y = 2;
boolean f = ((x ^ y) < 0); // false

不用临时变量交换两个数

int a = 1, b = 2;
a ^= b;
b ^= a;
a ^= b;
// 现在 a = 2, b = 1

消除数字n二进制中的最后一个1

n & (n - 1 )

一个数与本身异或的结果为0

a ^ a = 0
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值