您当前的位置: 首页 > 

MangataTS

暂无认证

  • 0浏览

    0关注

    423博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

蓝桥集训之位运算和相关函数

MangataTS 发布时间:2022-01-08 19:53:37 ,浏览量:0

配套视频链接

https://www.bilibili.com/video/BV1gL411c7eG

原码、反码、补码

https://blog.csdn.net/m0_46201544/article/details/121818968?spm=1001.2014.3001.5501

计组的内容,可以去搜一下先了解

位运算 &按位与 定义

如果两个相应的二进制位都为1,则该位的结果值为1,否则为0

举例

对于这样两个数:3、5,我们先将其转化为为二进制:

3 = ( 0011 ) 2 3=(0011)_2 3=(0011)2​

5 = ( 0101 ) 2 5=(0101)_2 5=(0101)2​

那么我们对其进行按照位与操作可得: ( 0001 ) 2 (0001)_2 (0001)2​也就是1

代码实现:

#include
int main()
{
	int a = 3,b = 5;
    printf("a&b = %d\n",a&b);
	return 0;
}
| 按位或 定义

两个相应的二进制位中只要有一个为1,该位的结果值为1

举例

对于这样两个数:3、5,我们先将其转化为为二进制:

3 = ( 0011 ) 2 3=(0011)_2 3=(0011)2​

5 = ( 0101 ) 2 5=(0101)_2 5=(0101)2​

那么我们对其进行按照位或操作可得: ( 0111 ) 2 (0111)_2 (0111)2​也就是7

代码实现:

#include
int main()
{
	int a = 3,b = 5;
    printf("a|b = %d\n",a|b);
	return 0;
}
^ 按位异或 定义

若参加运算的两个二进制位值相同则为0,否则为1

举例

对于这样两个数:3、5,我们先将其转化为为二进制:

3 = ( 0011 ) 2 3=(0011)_2 3=(0011)2​

5 = ( 0101 ) 2 5=(0101)_2 5=(0101)2​

那么我们对其进行按照位或操作可得: ( 0110 ) 2 (0110)_2 (0110)2​也就是6

代码实现:

#include
int main()
{
	int a = 3,b = 5;
    printf("a^b = %d\n",a^b);
	return 0;
}
~ 取反 定义

~是一元运算符,用于求整数的二进制补码,即分别将操作数各二进制位上的1变为0,0变为1。

举例

对于一个数字1,我们先对其转化为二进制并转化为补码: ( 00000001 ) H (00000001)_H (00000001)H​然后取反,那么可以得到: ( F F F F F F F E ) H (FFFFFFFE)_H (FFFFFFFE)H​,然后我们再求该数的原码则得:-2

代码实现:

#include
int main()
{
	int a = 1;
    printf("~a = %d",~a);
	return 0;
}
>1); return 0; } 一些应用

例如:

将该数的某一位设置为1

我们通过左移和或位运算即可将该数的某一位设置为1,或者是判断是否为1

eg:x|(1k&1

更多技巧请参考这篇文章:

https://zhuanlan.zhihu.com/p/54946559

位运算相关函数 __builtin_popcount(unsigned int n)

该函数时判断n的二进制中有多少个1

eg:

int n = 15; //二进制为1111
cout            
关注
打赏
1665836431
查看更多评论
2.3347s