位运算的一些技巧


@title:位运算
@author:五心先生
@time:2022-01-20


位运算O(1)的一些技巧

1. 成对变换

对于非负整数n:
当n为偶数时,n xor 1 等于 n+1
当n为奇数时,n xor 1 等于 n-1
因此,“0,1”、“2,3”、“4,5”关于 xor 1运算成对变换。

2. lowbit运算

求出二进制的数的右边第一个1的值。

例子 lowbit(110111000) = 1000。

过程:

n = 110111000

-n = 001000111 + 1

-n = 001001000

n & -n == n的二进制右边的第一个1。如果是n为2次幂的话。则 (n & -n == n)

int lowbit(int n)
{
	// (~n + 1) == -n   n的补码是 ~n + 1
	return (-n) & n;
}

3. 用异或交换位置

有a,b两个数,交换一下它们的位置。

例子:交换 4,7

过程:

a = 4 = 100

b = 7 = 111

t = a ^ b = 011

a = t ^ a = 111

b = t ^ a = 100

int change(int a,int b)
{
	t = a ^ b;
	a = t ^ a;
	b = t ^ a;   
}

4. 判断一个数的二进制的个数

int count(int n )
{
	int s = 0;
	for (int k = n; k; k >>= 1) s += k & 1;
	return s;
}

5. ! (非)和 ~(取反) 有区别。

~5 = 010;
!5 = 0;

6. 看一个数的第k位是0还是1

int if_count(int n)
{
	if (n >> k & 1) return 1;
    return 0;
}
  1. 易错点:and和&的区别
>>> 5 and 4
4			# 这是因为and判断是根据布尔类型判断,5为True,4为True,输出该值。这整个式子是真的
>>> 4 and 5
5
>>> 5 and 0
0			# 5为True, 0为假,还是输出该值。只是这整个式子是假的。

# 下面&是根据按位运算来进行输出的。
>>> 5 & 4
4
>>> 4 & 5
4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值