首页 > 其他分享 >位运算

位运算

时间:2024-10-27 12:21:21浏览次数:4  
标签:运算 int 取反 二进制位 num ans public

1.遍历二进制位 + 记录奇偶位

题目:奇偶位数

  • 遍历一个数的二进制位,记录奇偶位1的个数:
class Solution {
public:
	vector<int> evenOddBit(int n) {
		vector<int>ans(2);
		for (int i = 0; n; i ^= 1, n >>= 1)
			ans[i] += n & 1;

		return ans;
	}
};
  • 或者是位掩码,用16进制的0x55555,即二进制的010101...,直接与运算记录对应位置1的个数:
 class Solution {
 public:
     vector<int> evenOddBit(int n) {
         const int MASK = 0x5555;
         return {__builtin_popcount(n & MASK), __builtin_popcount(n & (MASK >> 1))};
     }
 };

2.对每一个二进制位取反

题目:数字的补数

简化题目:对一个数num的每一个二进制位取反,去掉前导0后输出对应的十进制数

思路:先求出num最高位的1,假如位置在s,然后设置一个最高位s为1,其余位为0的数字n,即n = 1 << s,然后 n - 1 就是前 s - 1 位都为1的数字,将其与num取反后的数按位与后,就可以实现对num每一个二进制位取反的效果(num的s位取反后肯定为0,所以不用管它)。

忘记取反运算符~的话看这里 取反运算符

class Solution {
public:
	int findComplement(int num) {
		int s = -1;
		for (int i = 31; i >= 0; --i) {
			if ((num >> i) & 1 != 0) {
				s = i;
				break;
			}
		}

		int n = 1 << s;

		return ~num & (n - 1);
	}
};

简单一点的取反可以看 4

3.计算二进制位1的个数

题目:位1的个数

一个比较重要的模版,需要记下来

class Solution {
public:
	int hammingWeight(int n) {
		int ans = 0;
		
		while (n) {
			ans++;
			n &= (n - 1);
		}

		return ans;
	}
};

4.判断一个数的二进制位是否有相邻的0

求一个数num的二进制位中是否有相邻的0,可以对num取反后求是否有相邻的1。

假如num二进制位有n位,先求一个n位全为1的掩码:mask = (1 << n) - 1 ,num取反后的数x为 x = num ^ mask ,如果 (x & (x >> 1))的结果为0,则表示x的二进制位中没有相邻的1,即num中没有相邻的0。

可以做这道题了:生成不含相邻0的二进制字符串

标签:运算,int,取反,二进制位,num,ans,public
From: https://www.cnblogs.com/Amroning/p/18508142

相关文章

  • C语言入门(5)--运算符
    C语言运算符运算符是C语言中用于执行特定数学或逻辑操作的符号。C语言提供了丰富的运算符,了解这些运算符及其用法是咱们编写程序的基础。1.算术运算符算术运算符用于执行基本的数学运算,如加、减、乘、除等。运算符描述示例+加法A+B将得到30-减法A-B将得到-10*......
  • Web高级开发实验:EL基本运算符与数据访问
    一、实验目的掌握EL的定义,即ExpressionLanguage,用于提高编程效率。学习和掌握在开发环境中创建Java文件,并在jsp文件中使用EL表达式去调用其中的方法与属性等。二、实验所用方法上机实操三、实验步骤及截图1、创建javaweb项目,在src文件夹下创建myClasses包。在myClasses包......
  • Halcon图像颜色通道拆分合并与四则运算
    读取图像并标注目标点灰度值,为后续对比做准备read_image(Image,'E:/Halcon/图片/880720666518444692.jpg')dev_set_draw('margin')dev_set_color('green')dev_get_window(WindowHandle)query_font(WindowHandle,Font)FontWithSize:=Font[0]+'-40&......
  • 【C语言】指针的运算
    目录1.指针加减整数2.指针减指针3.指针间的关系运算1.指针加减整数指针加减整数并不是简单的地址加减。在计算机内存中,每个变量都有一个唯一的存储位置,这个位置由其地址表示。当你对指针执行加法或减法操作,并传递一个整数值,实际上是改变了指针指向的位置,使其指向新......
  • 3.Java 运算符(算术运算符、赋值运算符、逻辑运算符、关系运算符、三元运算符、标识符
    一、算术运算符1、基本介绍运算符说明+正号-负号运算符说明+加-减*乘/除%取模(取余)运算符说明示例结果++自增(前),先运算后取值a=2;b=++a;a=3;b=3;++自增(后),先取值后运算a=2;b=a++;a=3;b=2;–自减(前),先运算后取值a=2;b=--a;a=1;b=1;–自减(后),先......
  • 位运算挑战:通过最少位翻转实现 a OR b == c【逐位处理与右移操作】
    引言在这篇文章中,我们将详细探讨一个常见的位操作问题:给定三个正整数a、b和c,通过最少的位翻转次数使得aORb==c。位操作在计算机科学中十分重要,特别是在涉及高效算法设计、底层优化和嵌入式系统编程时。本篇文章将通过逐步分析这个问题,详细讲解如何利用位运算规则......
  • C++左移运算符重载的理解
    最近学习C++学到了运算符重载的部分,大部分运算符重载都就可以实现作为类中成员函数和全局函数进行重载实现,而左移运算符“<<”却只支持全局函数进行重载。这是是为什么呢?我来谈谈我的理解。大家首先随便用cout输出一下,然后点击cout然后右键选择转到声明:我们会看到如下图显示......
  • 运算
    模二加(异或)运算模即取余模运算当两个整数a和b模n同余,记作a≡b(modn),意味着a和b被n除后余数相同。基本性质:封闭性:如果a≡b(modn)且c≡d(modn),那么a+c≡b+d(modn),以及a⋅c≡b⋅d(modn)。乘法逆元:对于任何整数a和正整数n,存在一个整数b使得a⋅b......
  • 位运算
    1、计算机中数字的二进制在计算机中,二进制正数和负数的表示方法不同。正数直接以其二进制形式表示,而负数则通过‌补码的形式表示。具体转换步骤‌原码‌:正数的原码与反码、补码相同,负数的原码是其绝对值的二进制表示,但最高位为1。例如,-5的原码为10000000000000000000000000......
  • Go 中,`...` 运算符
    在Go语言中,...运算符有两个主要用途,分别用于变长参数函数和切片展开。1.变长参数函数在Go语言中,使用...运算符可以定义一个接受可变数量参数的函数,也就是“变长参数函数”。这种函数可以接收不确定数量的参数,并将这些参数当作切片来处理。语法:funcfunctionName(args......