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

这篇具有很好参考价值的文章主要介绍了位运算【巧妙思路、两种常见题型】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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) << " " ;

输出的结果

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

也就是说,当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

拿一个具体样例来说

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

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

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

因此,就能得到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

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

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

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

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

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

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

  • X:168
  • lowbit(x):8

x - lowbit = 160

位运算【巧妙思路、两种常见题型】文章来源地址https://www.toymoban.com/news/detail-426622.html

到了这里,关于位运算【巧妙思路、两种常见题型】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Codeforces 1868C/1869E Travel Plan 题解 | 巧妙思路与 dp

    为了更好的阅读体验,请点击这里 题目链接:Travel Plan 题目大意: (n) 个点的完全二叉树,每个点可以分配 (1 sim m) 的点权,定义路径价值为路径中最大的点权,求所有路径的价值和。 对于任意长度(这里主要指包括几个节点)的路径 (t) ,最大点权不超过 (k) 的方案数

    2024年02月09日
    浏览(32)
  • 【LeetCode】【数据结构】单链表OJ常见题型(一)

     👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 🌝 每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 【LeetCode】203.移除链表元素 【LeetCode】206.反转链表  思路一 思路二 【LeetCode】876.链表的中间结点 快慢指针法

    2024年02月14日
    浏览(37)
  • 【LeetCode】【数据结构】单链表OJ常见题型(二)

     👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言: 【LeetCode】面试题02.04. 分割链表 【LeetCode】160. 相交链表 【LeetCode】141. 环形链表 【LeetCode】142. 环形链表Ⅱ 方法

    2024年02月14日
    浏览(45)
  • 在Excel中如何打开VBA,这里提供两种方法

    想在Excel中创建或添加自己的自定义Visual Basic脚本吗?第一步是了解如何在Excel中打开VBA编辑器。 在易用性和整体功能方面,没有其他电子表格应用程序能与Excel相提并论。无论你想做什么,只要你能深入挖掘Excel的深层菜单,就有很大的可能性可以选择。当你找不到该选项或

    2024年01月17日
    浏览(44)
  • 全面理解哈希,哈希的底层原理是如何实现的,哈希题型的做题思路与题目清单(不断更新)

    哈希(Hash)是一种算法,它接受一个输入(或“消息”),并返回一个固定大小的字符串。这个输出字符串的大小通常以字节为单位,输出的内容看起来是随机的且整个过程是单向的。 哈希的一些关键特性包括: 不管你输入的信息有多大,哈希值的大小总是固定的。 即使只

    2024年02月04日
    浏览(45)
  • 【数据结构】链表经典OJ题,常见几类题型(二)

    看到这类题型首先要判断链表是否相交,而相交条件: 两链尾部节点相同(地址相同, val 值相同, next 相同) 。这样我们便可 找到两链表的尾节点并判断这两个节点地址是否相同 ,若相同则两链表相交。上面这种情况两链表呈 \\\'Y\\\' 型,那么我们想一下两链表相交是否可以

    2024年02月05日
    浏览(46)
  • 计算机三级网络技术综合题、应用题常见题型答题技巧

    二、综合题 问题1 问题2 问题3 三、应用题 1.计算并填写下表 将IP地址和子网掩码全部转换成二进制:  111.181.21.9:01101111.10110101.00010101.00001001 255.192.0.0 :11111111.11000000.00000000.00000000 由子网掩码可得, 前10位是网络位,后22位是主机位 。 【1】   地址类别:【2023年3月场考题

    2024年02月07日
    浏览(51)
  • 【ACM竞赛入门】001.一文读懂常见的ACM题型输入输出格式

    本文通过各种类型的A+B题目来帮助大家快速了解ACM题目中常见的输入输出格式,帮助大家快速上手 时间限制: 1s 内存限制: 64MB 题目描述 Your task is to Calculate a + b. Too easy?! Of course! I specially designed the problem for acm beginners. You must have found that some problems have the same titles with this one,

    2024年02月07日
    浏览(56)
  • 网络安全:CTF入门必备之题型介绍

    CTF 题目类型一般分为 Web 渗透、RE 逆向、Misc 杂项、PWN 二进制漏洞利用、Crypto 密码破译。 在传统的CTF线上比赛中,Web类题目是主要的题型之一,相较于二进制、逆向等类型的题目,参赛者不需掌握系统底层知识;相较于密码学、杂项问题,不需具特别强的编程能力,故入门

    2024年02月10日
    浏览(60)
  • 二叉树叶子结点个数统计(两种思路)

    1.问题描述: 输入一棵二叉树,求出其叶子结点个数 2.要求: (1)设计二叉树的存储结构 (2)设计求叶子结点个数的递归算法 (3)用户输入的一串先序遍历字符串为二叉树节点 (4)输出二叉树的叶子节点个数 示例: 输入先序遍历的二叉树节点:abc##de#g##f### 二叉树叶子

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包