算法入门---位运算

运算符

位运算有逻辑运算符和位移运算符俩种,俩种运算符都是二进制运算符,都将数据在二进制下进行处理

逻辑运算符

& 位与运算符 同1为1 12&10 为8 计算原理如下

   1 1 0 0  (12)
         &
    1 0 1 0  (10)
   ----------
    1 0 0 0   (8)

| 位或运算符 同0为0 12|10 为10 计算原理如下

   1 1 0 0  (12)
       |
    1 0 1 0  (10)
   ----------
    1 1 1 0   (14)

^ 异或运算符 不同为1 12^10 为9 计算原理如下

   1 1 0 0  (12)
      ^
   1 0 1 0  (10)
  ----------
   1 0 0 1   (9)

~取反运算符 0变1 1变0 ~12 为3 计算原理如下

    1 1 0 0  (12)
         ~
    ----------
    0 0 1 1   (3)

位移运算符

左移 <<

x<<y 即x左移y 位, 相当于最左侧舍弃,最右侧补 0(左移相当于乘法,左移一位,相当于乘2的一次方,所以 x<<y 相当于 x*2^y)

右移>>

右移分为算术左移和逻辑左移俩种
算术右移
算术右移 ,即最右侧舍弃,最左侧补符号位
逻辑右移
逻辑右移 ,即最右侧舍弃,最左侧直接补0

注意当int类型移位过大时需要模32如 1<<35 ==1<<3
注意当long long类型(c语言)移位过大时需要模64如 1<<66 ==1<<2
看完了上面的是不是感觉没什么意思,事实上下面才是重点

例题

1.给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。原题见,力扣 231

思路:一个数n是二的幂次则n的二进制表示一定只含有一个1和其后的多个0,假设n是二的幂次,假设n的二进制为10000000则n-1的二进制为01111111则(n)&(n-1)一定为000000000(二进制位数不影响判断)

10000000 (n)
  &
01111111 (n-1)
--------------
00000000 (0)

即当n是二的幂次则(n)&(n-1)==0

bool isPowerOfTwo(int n){
  if( (n>0)&& (( n & ( n-1 ) )==0)) return true;
  else return false;
}

2.给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。

整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x 原题见 力扣 342

思路:首先四的幂一定是二的幂,其次二的幂不一定是四的幂,当二的幂对3取模,四的幂取模一定为1,而不是四的幂的二的幂取模为2

bool isPowerOfFour(int n){
  if(n>0&&((n&(n-1))==0)&&n%3==1) return true;
  else return false;
}

3.编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量) 原题见 力扣191
思路:给定一个数n 假设二进制为10110101 则n-1为10110100 二者向位与即可消去末尾的一个1(想不来可以看下面消去过程),重复操作记录消去次数即为1的个数

10110101 (n)
    &
10110100 (~(n-1))
--------------
10110100
int hammingWeight(uint32_t n) {
    int sum=0;
    while(n!=0)
    {
        n=n&(n-1);
        sum++;
    }
    return sum;
}

4.编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值 原题见 力扣16.01 交换数字
思路:首先任何数字异或本身为0即 a^a==0, 任何数字异或0等于其本身即 a ^ 0=a,并满足交换律即a ^ (b ^c)=a ^ c ^ b

a = a ^ b;
b = a ^ b;//b=b^a^b=b^b^a=0^a=a;
a = a ^ b;//a=a^b^a=b^0=b;
int* swapNumbers(int* a, int aSize, int* returnSize){
    a[0]=a[0]^a[1];
    a[1]=a[0]^a[1];
    a[0]=a[0]^a[1];
    *returnSize=2;
    return a;
}

位运算大致就这样吧,主要还是多看看题,多练习一下,最后补一个求奇偶

if (n & 1 == 1)
{
	//n为奇数
}
if (n & 1 == 0)
{
	//n为偶数
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值