【万人千题】算法按位或12.3总结
一:知识点
1,概念:
按位或(|),二元操作符,对两个整形数进行二进制位上的或运算
真值表如下:
左操作数 | 右操作数 | 值 |
1 | 0 | 1 |
1 | 1 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
总体来说就是:有一真即为真,两假才是假(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的幂了。
三:小总结
今天的第四题不会做,感觉最近输入变得太少,还是需要多学习再接着写题。大家一起加油吧。感谢看到这里的小伙伴了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了