【C++】位运算与相关算法问题

1.基础的位运算

在位运算中,比较重要的就是1.按位与(&),2.按位或(|),3.按位异或(^)。

&:有0则为0。

|:有1则为1。

^:(1)相同为0,不同为1。(2)无进位相加。

其中异或的两种理解方法都要记忆,后来会有用。

2.给一个数n,确定它的二进制表示中第x位是0还是1

n=(n>>x)&1

方法很简单,将这个数n向右移x位,再&1就行了。结果是0,答案就是0,结果是1,答案就是1。

举个例子:

n: ......01010010。判断第5位是0还是1。那么先将第5位向右移到第1位,就会得到.......0101,然后&00000...0001,结果就是1。所以第5位是1。

3.将一个数n的二进制表示的第x位修改成1

n=n|(1<<x)

和标题2的方法有些类似,只不过是将1向左移x位,然后| n就可以了。

举例:

n: .....0101001,要将第三位改成1就需要| ...100,而...100这个数是1向左移位的结果。

4.将一个数的二进制表示的第x位修改成0.

n=n&(~(1<<x))。

这个表达式就可以解决这个问题。

先将1左移x位,然后按位取反,再与n。我就不过多解释了,在草稿纸上演示一下应该可以理解。

5.提取一个数n二进制表示中最右侧的1

题目意思就是:如果n的二进制表示是00101100。经过处理后变成00000100

n=n&-n。通过这个等式就可以完成。

我们需要知道计算机是怎么处理-n的:先将n按位取反,然后加1。

还是上面的例子:

-n的二进制表示就是:11010100,这时&n刚好可以得到00000100

6.干掉一个数n二进制表示中最右侧的1.

方法一:

n=n^(n&-n)。

既然标题5中可以将最右侧的1提取出来,那么在此基础上让n与之异或一下就可以了!

记住:异或的深层含义:无进位相加!

方法二:

n=n&(n-1)。大家可以在草搞纸上画一画,应该不难。

7.异或运算(^)的运算律

1.a^0=a

2.a^a=0

3.异或运算满足交换律和结合律。

因为异或的深层含义是无进位相加,而加法运算是满足交换律和结合律的,所以异或运算同样满足。

相关推荐

  1. C++】运算相关算法问题

    2024-07-21 03:50:02       21 阅读
  2. 用PYTHON学算法DAY1--运算相关

    2024-07-21 03:50:02       47 阅读
  3. C++刷题】优选算法——运算

    2024-07-21 03:50:02       25 阅读
  4. leetcode算法-运算

    2024-07-21 03:50:02       47 阅读
  5. 算法-运算

    2024-07-21 03:50:02       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 03:50:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 03:50:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 03:50:02       45 阅读
  4. Python语言-面向对象

    2024-07-21 03:50:02       55 阅读

热门阅读

  1. Vue Router的路由正则表达式

    2024-07-21 03:50:02       16 阅读
  2. C++编程:实现一个跨平台安全的定时器Timer模块

    2024-07-21 03:50:02       19 阅读
  3. CSS中object-fit: cover;

    2024-07-21 03:50:02       18 阅读
  4. Git使用

    2024-07-21 03:50:02       18 阅读
  5. 推荐收藏!Python Flask 项目生产环境部署指南

    2024-07-21 03:50:02       21 阅读
  6. 对androidTestDebug 产物进行重新签名

    2024-07-21 03:50:02       16 阅读
  7. Hi6278

    Hi6278

    2024-07-21 03:50:02      21 阅读
  8. 安装archlinux

    2024-07-21 03:50:02       17 阅读
  9. 如何通过结构体来观察内存对齐和填充

    2024-07-21 03:50:02       15 阅读
  10. cd命令学习

    2024-07-21 03:50:02       19 阅读