算法 - 位运算

本文介绍了位运算的基础知识,包括位运算符概览和基础应用。通过实战演练部分,探讨了位运算在只出现一次的数字III问题、比特位计数以及N皇后问题中的巧妙运用。讲解了如何利用位运算快速计算二进制中1的个数,并提供了一个基于位运算的N皇后问题解决方案。
摘要由CSDN通过智能技术生成

文章放置于:https://github.com/zgkaii/CS-Notes-Kz,欢迎批评指正!

位运算基础

位运算符概览

符号 描述 运算规则
& 两个位都为1时,结果才为1
| 两个位都为0时,结果才为0
~ ~1 = 0 , ~0 = 1
^ 异或 两个位相同为0,相异为1
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0;
有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

基础应用

按位 与(&)

  • 清零:任何一个数字,只要与一个各位都为零的数值相与,结果为零。
  • 取一个数的指定位:比如取数X=1010 1110的低4位,另找一个数Y=0000 1111,按位与运算X&Y=0000 1110即得到X的指定位。
  • 判断奇偶:最末位为0,偶数;最末位为1,奇数。(a & 1) == 0 代替a % 2 == 0来判断奇偶。
  • 消去x最后一位的1x & (x - 1)

按位 或(|)

  • 来对一个数据的某些位设置为1:比如将数 X=1010 1110的低4位设置为1,只需要另找一个数Y=0000 1111,然后将X与Y进行按位或运算X|Y=1010 1111即可得到。

按位 非(~)

  • 使一个数的最低位为零:使a的最低位为0,可表示为:a&~1~1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。
  • 位操作交换符号:正数变成负数,负数变成正数。如a = ~a + 1。整数取反加1,正好变成其对应的负数(补码表示);负数取反加1,则变为其原码,即正数。

异或(^)

  • 翻转指定位:将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y=0000 1111,X与Y进行异或运算X^Y=1010 0001即得到。

  • 与0相异或值不变:例如1010 1110 ^ 0000 0000 = 1010 1110

  • 交换两个数

    void Swap(int &a, int &b){
         
        if (a != b){
         
            a ^= b;
            b ^= a;
            a ^= b;
        }
    }
    
  • 去掉三数中的重复数a ^ b ^ b = a

位移(<<与>>)

>> n算术右移,相当于除以 2n,例如 -7 >> 2 = -2。

11111111111111111111111111111001  >> 2
--------
11111111111111111111111111111110

>>> n无符号右移,左边会补上 0。例如 -7 >>> 2 = 1073741822。

11111111111111111111111111111001  >>> 2
--------
00111111111111111111111111111111

<< n算术左移,相当于乘以 2n。-7 << 2 = -28。

11111111111111111111111111111001  << 2
--------
11111111111111111111111111100100

Java 中的位操作

static int Integer.bitCount();           // 统计 1 的数量
static int Integer.highestOneBit();      // 获得最高位
static String toBinaryString(int i);     // 转换为二进制表示的字符串

实战演练

只出现一次的数字 III

260. 只出现一次的数字 III为例,给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

   public int
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值