[leetcode]刷题--关于位运算的几道题

news2024/11/16 20:35:42

(1)位运算的本质,其实是对二进制补码储存形式的修改。

位运算常见的运算符为

<<左移n个位置(算数移位,符号位不变)
>>右移动n个位置(采用直接丢弃末尾数字的方法,符号位不变)
(移位都是算数移位)

~按位取反(对于包括符号位在内全部取反)
&按位与
|按位或
^按位异或

注意上述操作,全是对补码进行的,所以说学好计算机组成很重要

(2)位运算时候要注意的几个问题

(1)关于负数左移溢出,在实际应用里面遇到了这个问题

先说是怎么样移动的,比如100111(假设这种数据类型长度只有六位,补码)

左移移位就会变成001110,是个正数。但是右移的时候会变成110011,还是个负数。这种移动方法似乎和王道等课程的说法不同,下面两个实验验证并总结

 cout<<((int)(pow(2,30))<<1)<<endl;
  //这个东西其实就是0,100000000.。。000;左移一位变成最小负数1,0000000000...000
  //这就印证了(存储和操作的形式是补码)(符号位参与移动/逻辑移位)
  cout<<((-2)>>1);
  //1,1111111..10  右移一位变成1,11111111.。11;
  //转化为源码就是1,000000.。01,结果就是-1,这里可以看出符号位不参与移动
  //或者说负数补码补的是1,所以等于没移动(可以视作算数移位)

  //总结起来就是对于无符号数,右移为算术移位,左移为逻辑移位,只有向右才会涉及到符号的保留

所以一般涉及到左右移位的时候,我们要尽可能使用无符号数来减少错误(unsigned int)

(2)因为是补码嘛,所以取反的结果可能不太一样。取反的时候连同符号位一起变化,并且是对补码形式进行操作。但是变成数值的时候还是按照补码转化源码的规则来的。

所以说尽量不要对负数进行取反操作

(3)遇到的几个题

(1)第一种类型,对于一个数的二进制形式进行判断

比如2的幂次方,结构就0001000..000,判断方法就是先按位取反1110111..111,然后和原本进行异或操作,如果异或结果为0,就代表符合这个结构

再比如4的幂次方,这个就不能用形式进行位操作的,要用数学归纳找到规律

//231题 2的幂
//原理为,(n)1000 (n-1)0111进行&操作,如果结果为0,那就是2的幂次方
//或者说相加为2n-1,也是可以的
//另外好要注意一个情况,2的n次方一定是正数
bool isPowerOfTwo(int n) {
    if((n&(n-1))==0){
        return true;
    }else{
        return false;
    }
}
//342 4的幂
//4的幂的特点就是,在2次幂次方的基础上,mod3=1
bool isPowerOfFour(int n) {
    if((n>0&&n&(n-1))==0){
        return (n%3==1);
    }else{
        return false;
    }
}

191题,检查1的位数

//191,每次向右移动一位,然后和1进行&操作,每个位置都检查一遍
int hammingWeight(uint32_t n) {
    int count=0;
    for(int i=1;i<=32;i++){
        if((n&1)==1)
            count++;
        n>>1;
    }
    return count;
}

面试题16.01,两数交换,其实运用的离散数学的规则就是a=a^b^b;

//面试题目16.01,两数交换,不开辟别的变量,交换两个数字
//注意这两个数字可能查出int最大界限,所以不能移动到没有计数的位置上,而是用^的方法进行处理
//举个例子,a=1101 b=0110; 先a=a^b=1011;1代表这个位置上ab不一样,0代表了这个位置上数字一样的
//分析,接下来a=1011,b=0110,分为四种情况
//如果a是1,b也是1,那么就代表原本的a在这位上和b不一样,为0
//如果a是1,b也是0,那么就代表原本的a在这位上和b不一样,为1
//如果a是0,b也是1,那么就代表原本的a在这位上和b一样,为1
//如果a是0,b也是0,那么就代表原本的a在这位上和b一样,为0
//这个关系恰好为异或,也就是说存在一个a=a^b^b的关系
//所以b可以变化为a,a也可以直接转化为b
vector<int> swapNumbers(vector<int>& numbers) {
    //原理其实就是a^b^b=a
    numbers[0]=numbers[0]^numbers[1];
    numbers[1]=numbers[0]^numbers[1];
    numbers[0]=numbers[0]^numbers[1];
    return numbers;
}

136题,寻找数组里单个的数字。。。这个可以说是专门为异或准备的一个题了 

//136题,寻找单个的数,用位运算就能解释
int singleNumber(vector<int>& nums) {
    int n=0;
    for(int i=0;i<nums.size();i++){
        n=n^nums[i];
    }
    return n;
}

693题,判断一个二进制数是否为交替的,这个题目还是蛮重要的。

思路就是两位两位地进行判断,采用右移(这题给的就是正整数,所以不用担心符号位是啥)

判断方法,和00000000..0011进行异或,如果结果为0或者11就代表这两位是一样的

//693交替二进制数
//写法上要注意点问题就是,有符号数的负值进行左移时会发生溢出报错,因为第一位符号位不变
//所以说尽可能右侧移动
bool hasAlternatingBits(int n) {
    while(n){
        if((n&3)!=0&&(n&3)!=3){
            n=n>>1;
        }else{
            return false;
        }
    }
    return true;
}

371题。。你可能需要更多一点的经验才能很快地做出这道逆天题目

先分析一下这道题,明显是要用位运算了

比如两个数字 a=011,b=010;

相加的话,首先a^b=001,这是按位相加后每一位的数字,a&b结果为010,是每个位置上产生的进位,因为每个位的进位要加到更高位上,所以就可以转化为

0001+0100(a&b左移一位,再和a^b相加),一直往下,直到没有进位(a&b变成0了),就返回此时的啊a

所以说这题很容易就能用递归处理

 另外关于我们之前一直关心的负数问题,递归过程中根据异或和且的性质,可以保留的

面试题15.01,纯纯的位操作

把对应位置全都改成0,然后直接加上移动后的数字即可

//15.01面试题
//其实不要给自己下绊子来得更快
int insertBits(int N, int M, int i, int j) {
    int n=pow(2,j-i+1)-1;//这个的计算没出问题
    int u=(N&~(n<<i))+(M<<i);
    return u;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Raphael使用(专治native 内存泄漏)

1.前期准备 在项目根目录build.gradle中,添加仓库地址&#xff1a; allprojects {repositories {maven { url https://jitpack.io }} }2.案例实践 构建一个新的Library Module&#xff0c;其中build.gradle中添加依赖&#xff1a; dependencies {implementation com.github…

gitlab-runner搭建CI/CD

1. 背景 每次发布代码&#xff0c;需要连接服务器更新代码&#xff0c;进行部署&#xff0c;比较繁琐&#xff0c;浪费时间。方案有jenkins或gitlab-runner。由于代码仓库是gitlab并且只需要自动部署&#xff0c;不需要其他额外功能&#xff0c;这里选择使用gitlab-runner。 …

【React】三.React组件基础学习

目录 React组件介绍 React组件的两种创建方式 使用函数创建组件 函数组件 渲染函数组件 示例 使用类创建组件 抽离为独立的JS文件 步骤 问题记录 React事件处理 事件绑定 记录问题 事件对象 有状态组件和无状态组件 无状态组件&#xff08;木偶组件&#xff09;…

XSS(Cross Site Scripting)攻击简介

环境 Ubuntu 22.04IntelliJ IDEA 2022.1.3JDK 17.0.3.1Spring Boot 3.0.1Firefox 108.0.2 问题和分析 在IntelliJ IDEA中创建Spring Boot项目 test0116 &#xff0c;并选中 Spring Web 依赖。 在 src/main/java 下创建 MyController.java 如下&#xff1a; package com.ex…

Redis缓冲区不会还有人不知道吧?

1 简介 缓冲区&#xff0c;用一块内存空间暂时存放命令数据&#xff0c;以免因 数据和命令的处理速度&#xff1c;发送速度而导致数据丢失和性能问题。但缓冲区的内存空间有限&#xff0c;若持续&#xff1a; 往里写数据速度&#xff1e;从里读数据速度会导致缓冲区需越来越…

ATGM332D-5N卫星导航模块介绍

ATGM332D-5N卫星导航模块简介ATGM332D-5N系列模块是12X16 尺寸的高性能BDS/GNSS 全星座定位导航模块系列的总称。该系列模块产品都是基于中科微第四代低功耗GNSS SOC单芯片—AT6558&#xff0c;支持多种卫星导航系统&#xff0c;包括中国的BDS&#xff08;北斗卫星导航系统&…

BFS的入门与应用

目录 一、前言 二、BFS原理 二、BFS与最短路径 1、最短路径问题用BFS 2、迷宫&#xff08;2019年省赛&#xff0c;填空题&#xff0c;lanqiaoOJ题号602&#xff09; &#xff08;1&#xff09;字典序最小的最短路径 &#xff08;2&#xff09;输出路径的两种方法 三、B…

拉伯证券|今年首批游戏版号发放,机构看好春节行业景气度恢复

2023年第一批游戏版号发放。 昨日晚间&#xff0c;国家新闻出版署发布1月国产网络游戏审批信息&#xff0c;共88款游戏获批&#xff0c;其我国内各大游戏龙头均有所收成&#xff0c;包含腾讯《黎明觉悟&#xff1a;活力》、网易《逆水寒》&#xff08;移动版&#xff09;、完美…

数据治理:数据治理之道-组织机制-敏捷的治理组织

参考《一本书讲透数据治理》、《数据治理》等 组织机制&#xff1a;敏捷的治理组织 数据、组织、软件平台&#xff0c;是企业数字化转型面临的三座大山 数据&#xff1a;数据是企业数字化转型的根本驱动力之一&#xff0c;数字化转型中的企业必须做好数据治理与应用&#xff…

8Manage:分散的软件正在扼杀公司的生产力

在企业领域&#xff0c;数字化不仅仅是指工具能力&#xff0c;而是指用户如何很好地应用他们的知识来做决策&#xff0c;培养关系&#xff0c;建立声誉&#xff0c;以及动员同事、团队。几十年来&#xff0c;企业已经部署了生产力、搜索和协作平台&#xff0c;以提高员工和业务…

使用 tslib 库

tslib 是专门为触摸屏设备所开发的 Linux 应用层函数库&#xff0c;并且是开源。tslib 为触摸屏驱动和应用层之间的适配层&#xff0c; 它把应用程序中读取触摸屏 struct input_event 类型数据&#xff08;这是输入设备上报给应用层的原始数据&#xff09;并进行解析的操作过程…

ceres学习笔记(三)

学习了example中pose_graph_3d的部分&#xff0c;记录一下学习过程。 前言&#xff1a; 翻译一下readme里面的内容&#xff1a; ... 该示例还说明了如何将 Eigen 的几何模块与 Ceres 的自动微分功能结合使用。 为了表示方向&#xff0c;我们将使用 Eigen 的四元数&#xff…

测试开发 | Pytest 结合 Allure 生成测试报告

本文节选自霍格沃玆测试学院测试开发内部教材&#xff0c;进阶学习文末加群&#xff01; 测试报告在项目中是至关重要的角色&#xff0c;一个好的测试报告&#xff1a; 可以体现测试人员的工作量&#xff1b; 开发人员可以从测试报告中了解缺陷的情况&#xff1b; 测试经理可…

锂电产业如何利用视觉检测系统降本增效?

导语&#xff1a;机器视觉检测已在锂电池生产的各个环节中&#xff0c;为产品产量与质量提供可靠保障。维视智造作为锂电池视觉检测系统提供商&#xff0c;为企业提供专业、系统、稳定的锂电行业解决方案&#xff0c;可保证0漏检&#xff0c;确保安全生产&#xff0c;全面提升生…

炫酷 RGB 之.NET nanoFramework 点灯大师

前面介绍了 .NET nanoFramework 入门&#xff0c;本文继续以微雪的 ESP32-S2-Pico 为例介绍 .NET nanoFramework 的开发&#xff1a;控制 ESP32 板载 RGB 灯 和 外接 RGB 灯。内容包含 状态灯的意义、WS2812 、HSV、PWM 等相关知识。 文章目录1. 背景2. 状态灯的意义3. 板载 LE…

萌新如何使用printf函数?

&#x1f40e;作者的话 如果你搜索输入输出函数&#xff0c;那么你会看到输入输出流、Turbo标准库、标准输出端、stdout什么什么乱七八糟的&#xff0c;作为一个萌新&#xff0c;哪懂这些&#xff1f; 本文介绍萌新在前期的学习中&#xff0c;常用的输入输出函数及其功能~ 跳跃…

ROS2机器人编程简述humble-第二章-Controlling the Iterative Execution .3.1

2.3 ANALYZING THE BR2 BASICS PACKAGE 这一节内容有些多……前一篇&#xff1a;ROS2机器人编程简述humble-第二章-DEVELOPING THE FIRST NODE .2里面只有节点&#xff0c;没有任何实际功能。logger.cpp代码如下所示&#xff1a;#include "rclcpp/rclcpp.hpp"using n…

微信小程序分享的图片被裁切了。怎么让他不裁剪正常比例5:4显示

现在的效果 希望的效果 最主要的是下面的这个函数。把图片转成了5:4的临时图片 cutShareImg(doctorImg:string ){let thatthis;return new Promise((resolve) > {wx.getImageInfo({src: doctorImg, // 这里填写网络图片路径 success: (res) > {var data resconsole.l…

使用 LibreOffice 将 word 转化为 pdf 并解决中文乱码问题

目录 一、安装 LibreOffice 二、解决乱码问题 2.1 查看是否安装中文字体 2.2 准备字体 2.3 导入字体 2.4 验证 项目中有一个在线上传 word 并预览 pdf 报告的需求&#xff0c;因为项目部署在 ubuntu 上面&#xff0c;所以借助libreoffice 实现 word 转 pdf&#xff0c;然…

详细实例说明+典型案例实现 对枚举法进行全面分析 | C++

第五章 枚举法 目录 ●第五章 枚举法 ●前言 1.简要介绍 2.代码及结果示例&#xff08;简单理解&#xff09; 3.生活实例 ●二、枚举法的典型案例——鸡兔同笼&质数求解 1.鸡兔同笼 2.质数求解&#xff08;枚举法&#xff09; ●总结 前言 简单的来说…