位运算【巧妙思路、两种常见题型】

news2024/9/22 0:40:15

这里介绍两种代码中位运算非常常用的操作

n的二进制表示中第k位数——右移操作 + &1

例如说,我们需要计算11的第2位数。

11 = (1011)2

我们常规思路就是将其转化为二进制数后,直接观察对应位置的值

这里需要注意的是第k位数指的是从右开始的第k位,即个位数是第一位

但是数字在计算机中都是直接以二进制数存放的,所以并不需要像我们一样转化为二进制。

为方便处理,我们的处理方式就是

  • 先将数字右移k位,让其位于第一位
  • 之后&1,就可以拿到第一位的值了

表示在代码中就是

n >> k & 1

例如我们现在需要输入n = 11的二进制的每一位

int n = 11;

for(int k = 3 ; k >= 0 ; k -- ) cout << ( n >> k & 1) << " " ;

输出的结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RkozuHQz-1682513371874)(assets/image-20230426202121-e9bd0e8.png)]

也就是说,当n=11=(1011)2

  • 右移一位时,n = 011
  • 右移两位时,n = 11
  • 右移三位时,n = 1

二进制1的个数——lowbit操作

lowbit:返回x的最后一位1

例如,x = 1100 ,lowbit(x) = 100

实现方式x & -x

问题一;为什么可以返回最后一位呢?

-x在计算机中是以补码存放的,也就是说-x = ~x + 1

拿一个具体样例来说

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vGArc1kt-1682513371874)(assets/image-20230426203011-oa8upnc.png)]

加上1之后,前面都将&0,结果直接是0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IdrT10wI-1682513371875)(assets/image-20230426203159-j0funy8.png)]

因此,就能得到X的最后一位1

我们只需要减去对应的lowbit就可以将最后的一位1给删除,一个个删除后,当x=0时,表示当前已经没有1了

实现代码:

#include<iostream>

using namespace std;

int lowbit(int x){
    return x & -x;
}

int n , x;

int main(){
    scanf("%d" , &n);
  
    while(n --){
        int cnt = 0;
        scanf("%d" , &x);
      
        int res = 0;
      
        while(x){
            x -= lowbit(x);
            cnt ++;
        }
      
        cout << cnt << " ";
      
    }
  
    return 0;
}

问题二:为什么减去lowbit就可以删去1呢?

这个问题,我们需要从计算机组成原理角度来讲解。

在计算机中并没有减法操作,且每一个数在计算机中都表示为二进制

因此,当需要运行减法操作时,实际上运算的是:x + (~y)

当我们需要计算这样一个数x = 1010 1000,对应lowbit = x & -x = 0000 1000

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YEhylgck-1682513371875)(assets/image-20230426204003-wd19egw.png)]

当他们x - lowbit(x) ,即x & (~lowbit(x))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-53fjjvWY-1682513371875)(assets/image-20230426204815-uyz9q3b.png)]

仔细验算一遍的确是减去了最后一个1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vEEZCuJ7-1682513371876)(assets/image-20230426204856-t3auerh.png)]

当然也可以带入十进制运算

  • X:168
  • lowbit(x):8

x - lowbit = 160

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBVZEaDe-1682513371876)(assets/image-20230426204911-a4ruytq.png)]

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

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

相关文章

Linux shell编程 条件语句

条件测试 test命令 测试表达式是否成立&#xff0c;若成立返回0&#xff0c;否则返回其他数值 格式1: test 条件表达式 格式2: [ 条件表达式 ]文件测试 [ 操作符 文件或者目录 ][ -e 1.txt ]#查看1.txt是否存在&#xff0c;存在返回0 echo $? #查看是上一步命令执行结果 0成…

DJ4-3 连续分配存储管理方式

目录 4.3.1 单一连续分配 4.3.2 固定分区分配 1. 分区说明表 2. 内存分配过程 4.3.3 动态分区分配 一、分区分配中数据结构 二、分区分配算法 三、分区分配操作 4.3.4 可重定位分区分配 1. 紧凑 2. 动态重定位 3. 动态重定位分区分配算法 连续分配是指为用户程…

【数据结构】堆(一)

&#x1f61b;作者&#xff1a;日出等日落 &#x1f4d8; 专栏&#xff1a;数据结构 如果我每天都找出所犯错误和坏习惯&#xff0c;那么我身上最糟糕的缺点就会慢慢减少。这种自省后的睡眠将是多么惬意啊。 目录 &#x1f384;堆的概念及结构&#xff1a; &#x1f384;堆的实…

万丈高楼平地起 AI帮你做自己

AI的自我介绍 AI是人工智能&#xff08;Artificial Intelligence&#xff09;的英文缩写&#xff0c;是一种通过计算机技术模拟和延伸人类智能的技术和应用。AI可以被看作是一种智能化的计算机程序或系统&#xff0c;它能够自动地执行一些需要人类智能才能完成的任务&#xf…

JavaEE初阶学习:初识网络

1.网络发展史 1.独立模式 独立模式:计算机之间相互独立&#xff1b; 2.网络互连 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同工作来完成业务&#xff0c;就有了网络互连。 网络互连&#xff1a;将多…

除了Figma,再给你介绍10款好用的协同设计软件

组织结构越来越复杂&#xff0c;团队中的每个人都有独特的技能、经验和专业知识。我们怎样才能让团队更好地合作&#xff1f;在这种情况下&#xff0c;协同设计应运而生。 UI的未来是协同设计&#xff01;如果你想把握未来的设计趋势&#xff0c;不妨从使用高效的协同设计软件…

Docker的安装以及本地部署ILLA Builder

1.安装Docker&#xff0c;当前版本V4.18.0 。Docker引擎启动运行之后&#xff0c;效果如下图&#xff08;喜欢暗黑主题&#xff09; Docker启动可能出错&#xff0c;“Docker Desktop requires a newer WSL kernel version.” 如下图所示 解决方法&#xff0c;比较简单&#xf…

测试用例的基本要素和设计方法

作者&#xff1a;爱塔居 专栏&#xff1a;软件测试 作者简介&#xff1a;大三学生&#xff0c;希望同大家一起进步&#xff01; 文章简介&#xff1a;介绍写测试案例的功能需求测试和非功能需求测试和具体方法&#xff1a;判定表、正交表、等价类、边界值等 文章目录 目录 文章…

if条件语句

if条件语句 条件测试 test 测试表达式是否成立&#xff0c;若成立返回0&#xff0c;否则返回其他数值 格式1 &#xff1a;test 条件表达式&#xff1b;格式2 &#xff1a;[ 条件表达式 ] echo $?参数作用-d测试是否为目录 (Directory)-e测试目录或文件是否存在(Exist)-f测…

好物周刊#1:提示工程师养成指南

文章目录 &#x1f388; 项目ddruntiny-vuenetease-recent-profile &#x1f4bb; 软件BobScreenToGifSnipaste &#x1f578;️ 网站BrowserFramedocsmallDimmy.club &#x1f50c; 插件AdGuard[Global Speed: 视频速度控制](https://microsoftedge.microsoft.com/addons/deta…

强化学习-Double DQN、竞争网络结构和Rainbow(第4章)

来源书籍&#xff1a; TENSORFLOW REINFORCEMENT LEARNING QUICK START GUIDE 《TensorFlow强化学习快速入门指南-使用Python动手搭建自学习的智能体》 著者&#xff1a;[美]考希克巴拉克里希南&#xff08;Kaushik Balakrishnan&#xff09; 译者&#xff1a;赵卫东 出版…

【每日一题】leetcode21 - - 合并两个有序链表

文章目录 1.题目描述2.解题思路方法1&#xff1a;方法2&#xff1a; 1.题目描述 题目链接&#xff1a;力扣21&#xff0c;合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.解题思路 方法1&#xff1a;…

牛客网Verilog刷题——VL38

牛客网Verilog刷题——VL38 题目答案 题目 设计一个自动贩售机&#xff0c;输入货币有三种&#xff0c;为0.5/1/2元&#xff0c;饮料价格是1.5元&#xff0c;要求进行找零&#xff0c;找零只会支付0.5元。需要注意的是&#xff0c;投入的货币会自动经过边沿检测并输出一个在时钟…

【采坑专栏】【错误记录】起系统

doc说明 一级标题分大的&#xff0c;二级标题尽量加&#xff0c;三级标题是具体问题 语法 我的老毛病-易错的 多驱 复制粘贴导致前后一样 管脚约束还是直接选吧 多驱动 Vivado WARNING&#xff1a;Multi-driven net Q with xth driver pin 警告的原因和消除方法 出现这…

注意力机制:基于Yolov8的Triplet注意力模块,即插即用,效果优于cbam、se,涨点明显

论文&#xff1a;https://arxiv.org/pdf/2010.03045.pdf 本文提出了可以有效解决跨维度交互的triplet attention。相较于以往的注意力方法&#xff0c;主要有两个优点&#xff1a; 1.可以忽略的计算开销 2.强调了多维交互而不降低维度的重要性&#xff0c;因此消除了通道和权…

STM32F4_SRAM中调试代码

目录 1. 在RAM中调试代码 2. STM32的三种存储方式 3. STM32的启动方式 4. 实验过程 通过上一节的学习&#xff0c;我们已经了解了SRAM静态存储器&#xff1b; 1. 在RAM中调试代码 一般情况下&#xff0c;我们在MDK中编写工程应用后&#xff0c;调试时都是把程序下载到芯片…

Android类似微信聊天页面教程(Kotlin)四——数据本地化

前提条件 安装并配置好Android Studio Android Studio Electric Eel | 2022.1.1 Patch 2 Build #AI-221.6008.13.2211.9619390, built on February 17, 2023 Runtime version: 11.0.150-b2043.56-9505619 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 …

Flink从入门到精通之-07处理函数

Flink从入门到精通之-07处理函数 之前所介绍的流处理 API&#xff0c;无论是基本的转换、聚合&#xff0c;还是更为复杂的窗口操作&#xff0c;其实都是基于 DataStream 进行转换的&#xff1b;所以可以统称为 DataStream API&#xff0c;这也是 Flink 编程的核心。而我们知道…

同样是测试,你年薪50W,我年薪10W,我哭了...

软件测试可以拿到年薪50万&#xff1f; 开什么玩笑&#xff1f; 我才月薪15K。 小伙伴看到标题是不是一开始的反应是这样的&#xff1f;是的话举一个小爪爪吧&#xff01; 那软件测试到底能不能拿到年薪50万呢&#xff1f; 没有吃过猪肉还没见过猪跑吗&#xff0c;你自己没…

【云原生-深入理解Kubernetes-1】容器的本质是进程

文章目录 &#x1f479; 关于作者一、为什么会出现容器&#xff1f;二、容器是什么&#xff1f;三、容器“边界”的实现手段3.1、进程如何运行的&#xff1f;3.2、Namespace 与 Docker 边界容器的本质是一个进程这是怎么做到的呢&#xff1f; 总结✊ 最后参考 &#x1f479; 关…