探究位运算中的神奇操作:n&(n-1)

简介: 探究位运算中的神奇操作:n&(n-1)

引言

在编程和算法领域,位运算因其高效性和独特性备受青睐。今天,我们就来探讨一个有趣的位运算操作:n&(n-1),看看它究竟有何妙用。

一、n&(n-1)的作用

n&(n-1)这个操作的作用是:将整数n的二进制表示中的最低位的1变为0。

例如:100的二进制表示为1100100,通过一次n&(n-1)运算后,生成二进制数1100000。可以看出,n的二进制表示中的最低位的1(红色部分)被成功变为0。这就是n&(n-1)的作用。

二、n&(n-1)的应用场景

1.统计一个二进制数中1的个数

我们可以利用n&(n-1)操作来统计一个二进制数中1的个数。具体做法是:每次执行n&(n-1)操作,将n的二进制表示中的最低位的1变为0,同时计数器加1。直到n变为0,计数器的值即为整数中1的个数。以下是C语言实现:

#define _CRT_SECURE_NO_WARNINGS
//统计二进制数1的个数
#include<stdio.h>
int main()
{
  int n=0;
  int count = 0;
  scanf("%d", &n);
  while(n)
  {
    n &= (n - 1);//即n=n&(n-1)进行n&(n-1)运算再把得到的结果赋值给n
    count++;
  }
  printf("%d", count);
  return 0;
}

运行结果如下:                                            

2. 判断一个数是否为2的幂次方

判断一个数是否为2的幂次方,可以通过n&(n-1)来实现。如果一个数是2的幂次方,那么它的二进制表示中只有一个1,其余位都是0。例如:2(10)、4(100)、8(1000)...都是2的幂次方。

对于这些数,执行n&(n-1)操作后,结果必然为0。以下是C语言实现:

#define _CRT_SECURE_NO_WARNINGS
//判断一个数是否为2的幂
#include<stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  if ((n&(n - 1)) == 0)
  {
    printf("yes\n");
  }
  else
  {
    printf("no\n");
  }
  return 0;
}

运行结果如下:

总结

n&(n-1)这个位运算操作虽然简单,但其应用场景却非常广泛。通过本文的介绍,相信大家对n&(n-1)有了更深入的了解。在今后的编程和算法实践中,不妨尝试运用这个神奇的操作,提高代码的执行效率。

 


相关文章
|
机器学习/深度学习 人工智能 搜索推荐
AIGC的五个特点
【1月更文挑战第11天】AIGC的五个特点
1418 3
AIGC的五个特点
|
小程序 安全 数据安全/隐私保护
微信小程序全栈开发中的身份认证与授权机制
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中的身份认证与授权机制。身份认证包括手机号验证、微信登录和第三方登录,而授权机制涉及角色权限控制、ACL和OAuth 2.0。实践中,开发者可利用微信登录获取用户信息,集成第三方登录,以及实施角色和ACL进行权限控制。注意点包括安全性、用户体验和合规性,以保障小程序的安全运行和良好体验。通过这些方法,开发者能有效掌握小程序全栈开发技术。
670 0
|
JavaScript Java 测试技术
『App自动化测试之Appium基础篇』| 从定义、原理、环境搭建、安装问题排查等深入了解Appium
『App自动化测试之Appium基础篇』| 从定义、原理、环境搭建、安装问题排查等深入了解Appium
5126 0
|
5月前
|
人工智能 程序员 PHP
Cursor AI来袭!编程从此不再繁琐,一键生成代码,效率提升千倍
AI攻破最后防线!连架构设计都能自动生成,中级程序员集体破防
814 10
Cursor AI来袭!编程从此不再繁琐,一键生成代码,效率提升千倍
|
8月前
|
消息中间件 安全
为什么会选择使用RabbitMQ ? 有什么好处 ?
选择使用RabbitMQ是因为RabbitMQ的功能比较丰富 , 支持各种消息收发模式(简单队列模式, 工作队列模式 , 路由模式 , 直接模式 , 主题模式等) , 支持延迟队列 , 惰性队列而且天然支持集群, 保证服务的高可用, 同时性能非常不错 , 社区也比较活跃, 文档资料非常丰富 使用MQ有很多好处: ● 吞吐量提升:无需等待订阅者处理完成,响应更快速 ● 故障隔离:服务没有直接调用,不存在级联失败问题 ● 调用间没有阻塞,不会造成无效的资源占用 ● 耦合度极低,每个服务都可以灵活插拔,可替换 ● 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去
|
11月前
|
机器学习/深度学习 存储 人工智能
转载:【AI系统】计算之比特位宽
本文详细介绍了深度学习中模型量化操作及其重要性,重点探讨了比特位宽的概念,包括整数和浮点数的表示方法。文章还分析了不同数据类型(如FP32、FP16、BF16、FP8等)在AI模型中的应用,特别是FP8数据类型在提升计算性能和降低内存占用方面的优势。最后,文章讨论了降低比特位宽对AI芯片性能的影响,强调了在不同应用场景中选择合适数据类型的重要性。
转载:【AI系统】计算之比特位宽
|
8月前
|
监控 Java Nacos
阿里二面:10亿级分库分表,如何丝滑扩容、如何双写灰度?阿里P8方案+ 架构图,看完直接上offer!
阿里二面:10亿级分库分表,如何丝滑扩容、如何双写灰度?阿里P8方案+ 架构图,看完直接上offer!
阿里二面:10亿级分库分表,如何丝滑扩容、如何双写灰度?阿里P8方案+ 架构图,看完直接上offer!
|
9月前
|
人工智能 自然语言处理 JavaScript
Aider:27.6K Star!这个终端AI编程神器能用语音改代码,自动生成Git记录并提交,接入DeepSeek斩获编程基准最高分
Aider 是一款基于命令行的开源 AI 编程助手,支持多种编程语言和主流 LLM,可自动完成代码修改、Git 提交及语音交互。
1358 1
|
存储 算法 数据处理
C++一分钟之-范围基础:views与ranges
【7月更文挑战第1天】C++20的Ranges库简化了集合操作,引入了Range(具有begin()和end()的对象)和View(延迟计算的Range)。常见问题包括混淆Range与Container、忽视View的延迟性和错误修改只读View。要避免错误,需理解Range概念、明确操作执行时机并检查View的可变性。代码示例展示了如何过滤并平方vector中的奇数,体现Range的使用。范围库带来了代码的简洁和效率,但理解其工作原理至关重要。
370 0
|
11月前
|
数据采集 数据安全/隐私保护 Python
【Python】已解决:urllib.error.HTTPError: HTTP Error 403: Forbidden
通过上述方法,可以有效解决 `urllib.error.HTTPError: HTTP Error 403: Forbidden` 错误。具体选择哪种方法取决于服务器对请求的限制。通常情况下,添加用户代理和模拟浏览器请求是最常见且有效的解决方案。
666 10