【万人千题】算法按位或12.3总结

一:知识点

1,概念:

  按位或(|),二元操作符,对两个整形数进行二进制位上的或运算

真值表如下:

左操作数右操作数
101
111
011
000

总体来说就是:有一真即为真,两假才是假(C语言中默认0为假,非0为真)。

2,应用:

1.定位处理二进制位中的某一位

比如,现在有一个数10010011101,我希望将它的二进制位的第5位,不论原先是什么,都变成1。(补充 一个小知识点:可以用0b开头表示二进制数),这时候,我只需要将这个数或上一个0b1000即可,因为:从上面真值表我们可以发现,一个数的某一位不论是什么,或上1就一定会变成1,其他位或上0,原来是0还是0,是1还是1,不会改变。

再比如,一样是这个数10010011101,我希望将它二进制位第5位的如果是1改成0。这时候该怎么做?我们可以让他按位或上0b10000,再减去同一个数。从或上0b10000可以看到,第五位不管是1还是0都会变成1,这时候再减去一个相同的数就恰好将其消去。

2.将一个数二进制位数的低位几个连续0都转为1

如一个数a=0b11111000000,如题所说,希望将后面连续0全变成1,那么将这个数减一我们从二进制的减法中可以直到,最小位上的1会变成0,它之后的全部0会变成1,也就是a-1=0b11110111111,这时候再与原数或一下就可以将低位上的连续0变成1.

二:习题

1356. 根据数字二进制下 1 的数目排序 - 力扣(LeetCode) (leetcode-cn.com)

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 int cmp(const void*e1,const void*e2)
 {
     int count1=0;
     int count2=0;
     int i=*(int*)e1;
     int j=*(int*)e2;
     while(i)
     {
         i&=i-1;
         count1++;
     }
    while(j)
     {
         j&=j-1;
         count2++;
     }
     if(count1==count2)
     return *(int*)e1-*(int*)e2;
     if(count1>=count2)
     return 1;
     else
     return 0;
 }
int* sortByBits(int* arr, int arrSize, int* returnSize)
{
   qsort(arr,arrSize,sizeof(int),cmp);
   *returnSize=arrSize;
   return arr;
}

这个实际上是自己写排序规则,我们需要按照题目要求的排序规则在cmp中实现。

 762. 二进制表示中质数个计算置位 - 力扣(LeetCode) (leetcode-cn.com)

bool Isprime(int n)
{
    if(n==1)
    return false;
     int i=2;
     for(;i<=sqrt(n);i++)
     {
         if(n%i==0)
         return false;
     }
     return true;
}
int countPrimeSetBits(int left, int right)
{
    int i=left;
    int countsum=0;
    for(;i<=right;i++)
     {
         int count=0;
         int j=i;
         while(j)
         {
             j&=j-1;
             count++;
         }
        if(Isprime(count))
        countsum++;
     }
     return countsum;
}

这道题就是计算一个数中二进制有多少位1,然后判断这个二进制1的位数是否是素数。

 直接用一个count计数,记录每个数的二进制中1的个数传入判断的函数即可。

231. 2 的幂 - 力扣(LeetCode) (leetcode-cn.com)

//解法一:
// bool isPowerOfTwo(int n)
// {
//       double i=log2(n);
//       if(i==(int)i)
//       return true;
//       else
//       return false;
// }
//解法二:
bool isPowerOfTwo(int n)
{
    if(n<=0)
    return false;
     if(n&(n-1))
     return false;
     return true;
}

实际上用的是按位与的方法。如上面所写,一个数减一之后他最低位1的后面全是1,这个最低为的1变成0.而如果是2的幂,说明它只有一个二进制位上的1,减1之后与原数相与如果不是0,就说明还有额外的二进制1,也就不是2的幂了。 

三:小总结

今天的第四题不会做,感觉最近输入变得太少,还是需要多学习再接着写题。大家一起加油吧。感谢看到这里的小伙伴了。

posted @   C_Ryson  阅读(31)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示