ARTS 挑战打卡的第9天 --- 如何知道一个数是否为2的若干次幂(Algorithm)

前言

(1)今天看到一个有意思的问题,如何判断一个数字是否为2的若干次幂。这个问题并不难,但是对于我们的C语言功底还是有一点点的考验的。
(2)希望各位可以先自行思考,实在想不出来再看后面的讲解。提示,C语言的位运算是一个好东西。

解析

2的若干次幂数所存在的特征点

(1)首先,我们需要知道2的若干次幂所存在的特征点。当我们知道了这个特征点之后,就可以将这个特征点与其他数进行分离了。
(2)我们都知道,计算机是2进制系统。如果让一个数字乘以2,我们是不是可理解为,让这个二进制数右移动一位呢?

在这里插入图片描述

(3)既然我们知道了,在计算机中乘以2就是进行一次右移操作。那么2的n次幂,是不是就是二进制数1进行右移n次呢?例如,数字2换成二进制是10,而十进制的数字2恰好就是2的1次幂,因而二进制的1进行一次右移操作。
(4)好,我们再进行扩展,既然2的n次幂就是数字1进行右移n次。那么2的n次幂在二进制中是不是有一个特点,那就是只有一个位为1!(不理解的同学可以看一下下面这几个例子,我们发现2的n次幂的数8和4只有一个位为1)

在这里插入图片描述

如何提取这个特征点

(1)现在我们知道了2的若干次幂在二进制中,只会有一个位是1,其他位是数字0。因此,我们是不是得想个办法,判断一个二进制数只存在一个1。
(2)于是,我们可以想到"&"运算。他的特点在于,有0出0。假设我们的二进制数是100,那么让100减去1变成011。这样原来那个存放唯一数字1的地方就会变成0了。
(3)然后100&011,就会变成0。最后逻辑取反即可。

!((x)&(x-1))

在这里插入图片描述

(4)但是肯定有朋友会想举其他例子尝试反驳,很不幸的是你找不到的。
(5)为什么这么说呢?因为,我们要抓住这个方法的巧妙之处,我们是将唯一的存放1的位变成0。
(6)但是,我们假设有一个可以反驳的数1010。(注意,这里是假设)1010-1=1001,有没有发现一个问题,这里的最高位的数字1永远无法被消除。因此,进行如上操作之后,最终还是可以分辨出这不是2的n次幂。

上述代码存在bug?

bug1 — 不承认1为2的若干次幂

(1)看到上述代码,有一些东西肯定想到了一个刁钻的角度。数字1经过上述代码,最终输出的也是1啊。所以你这个代码有问题!这个时候我建议还是重新学一下小学数学啊(苦笑)。1就是2的0次幂呀
(2)但是有一些朋友就是不承认1怎么办呢?也很简单,判断这个数是不是1呗。

x == 1 ? 0 : !((x)&(x-1))

bug2 — 数字0所导致的问题

(1)数字1导致的问题解决了,我们角度再刁钻一点,假设这个数字是0呢?真的可以吗?
(2)我们在Linux中执行如下代码。

#include <stdio.h>
#include <stdlib.h>#define if_2_equation(x)  !((x)&(x-1))int main(int argc,char** argv)
{char i;//如果输入参数小于2个,打印本程序使用方法if(argc < 2){printf("Usage: \r\n");printf("%s <string> \r\n",argv[0]);return -1;}i = strtol(argv[1], NULL, 0);printf("number = %d \r\n",i);if(if_2_equation(i)){printf("yes\r\n");}else{printf("no\r\n");}return 0;
}

在这里插入图片描述

(3)执行发现,数字0也被当成了2的若干次幂,这个从数学的角度上来看,怎么也说不清楚啊。为什么会发生这种情况呢?很简单,0&所有的数,都是0。因此,这里就存在bug。
(4)怎么处理呢?很简单,进行一次判断呗。

#define if_2_equation(x)  x == 0 ? 0 : !((x)&(x-1))

(5)但是有些骚年会想,我1和0这两个数都不打算当成2的若干次幂来判断,这个怎么处理呢?也很简单,进行两次判断呗。

#define if_2_equation(x)  x == 0 ? 0 : (x == 1 ? 0 : !((x)&(x-1)))

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

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

相关文章

rabbitmq的消息应答

消费者完成一个任务可能需要一段时间&#xff0c;如果其中一个消费者处理一个长的任务并仅只完成 了部分突然它挂掉了&#xff0c;会发生什么情况。RabbitMQ 一旦向消费者传递了一条消息&#xff0c;便立即将该消 息标记为删除。在这种情况下&#xff0c;突然有个消费者挂掉了…

数据分析两件套ClickHouse+Metabase(一)

ClickHouse篇 安装ClickHouse ClickHouse有中文文档, 安装简单 -> 文档 官方提供了四种包的安装方式, deb/rpm/tgz/docker, 自行选择适合自己操作系统的安装方式 这里我们选deb的方式, 其他方式看文档 sudo apt-get install -y apt-transport-https ca-certificates dirm…

魔改 axuanup 的 aardio和python 猜拳游戏 代码

根据 axuanup 的 aardio和python 猜拳游戏 代码&#xff0c;魔改了一个风格不一样的代码。 争取做到代码尽量“简”&#xff0c;但还没到“变态简”的程度&#xff0c;因为还能看懂。 原文&#xff1a;aardio和python 猜拳游戏-自由交流乐园-Aardio资源网 代码如下&#xff…

【Flutter】【基础】CustomPaint 绘画功能(一)

功能&#xff1a;CustomPaint 相当于在一个画布上面画画&#xff0c;可以自己绘制不同的颜色形状等 在各种widget 或者是插件不能满足到需求的时候&#xff0c;可以自己定义一些形状 使用实例和代码&#xff1a; CustomPaint&#xff1a; 能使你绘制的东西显示在你的ui 上面&a…

竞赛项目 酒店评价的情感倾向分析

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 酒店评价的情感倾向分析 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/post…

用Python做一个滑雪小游戏

游戏是让人娱乐和放松的好方式&#xff0c;而编写和玩自己的游戏则是一种特别有趣的体验。在本文中&#xff0c;我们将使用Python和pygame库来创建一个简单的滑雪小游戏。通过这个小游戏项目&#xff0c;我们将学习如何使用Python编程语言来制作自己的游戏&#xff0c;并且享受…

IT运维:使用数据分析平台监控深信服防火墙

概述 深信服防火墙自身监控可以满足绝大部分需求&#xff0c;比如哪个应用占了最大带宽&#xff0c;哪个用户访问了哪些网站&#xff1f;这里我们为什么使用鸿鹄呢&#xff1f;因为我们要的是数据的处理和分析&#xff0c;比如某个用户在某个事件都做了哪些行为&#xff0c;这个…

【设计模式】前端控制器模式

前端控制器模式&#xff08;Front Controller Pattern&#xff09;是用来提供一个集中的请求处理机制&#xff0c;所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志&#xff0c;或者跟踪请求&#xff0c;然后把请求传给相应的处理程序。以下是这种…

基于鲲鹏平台Ceph深度性能调优

刘亮奇 架构师技术联盟 2021-04-12 07:50 摘自&#xff1a; https://mp.weixin.qq.com/s/o9HH-8TF0DbMqHrvsFh1NA 随着 IOT、大数据、移动互联等应用的暴涨&#xff0c;产生的数据也越来越多&#xff0c;整个存储市场总量也逐年增长&#xff0c;预计到 2021 年分布式存储会占到…

UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数

引言&#xff1a; 所有的操作系统都为运行在其上的程序提供服务&#xff0c;比如&#xff1a;执行新程序、打开文件、读写文件、分配存储区、获得系统当前时间等等 1. UNIX体系结构 从严格意义上来说&#xff0c;操作系统可被定义为一种软件&#xff0c;它控制计算机硬件资源&…

CTFshow 限时活动 红包挑战7、红包挑战8

CTFshow红包挑战7 写不出来一点&#xff0c;还是等了官方wp之后才复现。 直接给了源码 <?php highlight_file(__FILE__); error_reporting(2);extract($_GET); ini_set($name,$value);system("ls ".filter($_GET[1])."" );function filter($cmd){$cmd…

【图像分类】理论篇(2)经典卷积神经网络 Lenet~Densenet

1、卷积运算 在二维卷积运算中&#xff0c;卷积窗口从输入张量的左上角开始&#xff0c;从左到右、从上到下滑动。 当卷积窗口滑动到新一个位置时&#xff0c;包含在该窗口中的部分张量与卷积核张量进行按元素相乘&#xff0c;得到的张量再求和得到一个单一的标量值&#xff0c…

SQL- 每日一题【1327. 列出指定时间段内所有的下单产品】

题目 表: Products 表: Orders 写一个解决方案&#xff0c;要求获取在 2020 年 2 月份下单的数量不少于 100 的产品的名字和数目。 返回结果表单的 顺序无要求 。 查询结果的格式如下。 示例 1: 解题思路 1.题目要求我们获取在 2020 年 2 月份下单的数量不少于 100 的产品的…

IO多路复用

常见的网络IO模型 网络 IO 模型分为四种&#xff1a;同步阻塞 IO(Blocking IO, BIO)、同步非阻塞IO(NIO, NewIO)、IO 多路复用、异步非阻塞 IO(Async IO, AIO)&#xff0c;其中AIO为异步IO&#xff0c;其他都是同步IO 同步阻塞IO 同步阻塞IO&#xff1a;在线程处理过程中&am…

Redis_事务操作

13. redis事务操作 13.1事务简介 原子性(Atomicity) 一致性(Consistency) 隔离性(isolation) 持久性(durabiliby) ACID 13.2 Redis事务 提供了multi、exec命令来完成 第一步&#xff0c;客户端使用multi命令显式地开启事务第二步&#xff0c;客户端把事务中要执行的指令发…

前沿分享-通过经皮神经刺激来治疗糖尿病神经性疼痛

经皮神经电刺激&#xff08;PENS&#xff09;设备用于对糖尿病周围神经病变引起的慢性、顽固性疼痛进行多次治疗。 放在耳朵上的这种可穿戴设备在几天内持续提供低水平的脉冲电流。 这是一种安全有效的非麻醉性替代治疗慢性疼痛的方法。还有一张设备放在糖足上的照片&#xff0…

向量数据库 Milvus Cloud Partition Key:租户数量多,单个租户数据少的三种解决方案

三种解决方案 这个问题提出的时候,Milvus 的最新版本是 2.2.8,我们做个角色互换,在当时站在这个用户的角度,留在我们面前的选择有这么几个: 为每个租户创建一个 collection 为每个租户创建一个 partition 创建一个租户名称的标量字段 接下来,我们依次分析下这三种方案的可…

《零基础实践深度学习》(第2版)学习笔记,(五)深度学习与计算机视觉

文章目录 1. 计算机视觉概述2. 图像分类3. 目标检测 1. 计算机视觉概述 图像分类 目标检测 2. 图像分类 3. 目标检测

01-C++数据类型

3、基础类型 3.1、简单变量 变量的命名 carDrip和cardRip 或boat_sport和boats_port 此外&#xff0c;还有有前缀的命名&#xff0c;使用前缀表示数据类型。常见的前缀有:str&#xff08;表示字符串&#xff09;、n&#xff08;表示整数值&#xff09;、b&#xff08;表示…