剑指offer----C语言版----第十天

news2024/11/28 8:32:56

目录

1. 二进制中 1 的个数

1.1 题目描述

1.2 可能引起错误的解法

1.3 常规解法

1.4 思路优化


1. 二进制中 1 的个数

原题链接:  

剑指 Offer 15. 二进制中1的个数 - 力扣(LeetCode)https://leetcode.cn/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/

1.1 题目描述

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 汉明重量).)。

1.2 可能引起错误的解法

基本思路:  先判断整数二进制表示中最右边的一位是不是1,  接着把输入的整数右移一位,  此时原来处于从右边数起的第二位被移到最右边了,  再判断是不是1,  就这样每次移动一位,  直到整个整数变为0为止.  现在的问题就是如何判断一个整数的最右边的二进制位是不是1.  显然我们只需要把整数和1做按位与运算看结果是不是0就可以了.  因为整数1的最右边的二进制位是1,  其余全是0.  如果一个整数与 1 做按位与运算的结果是 1 则说明该整数的最右边的二进制位是1,  反之则是 0 .

整数右移一位和把整数除以2在数学上是等价的,  那我们能将右移运算换成除法运算吗? 

注意:  在编程中移位运算的效率是要比乘除法要高一点点的,  在实际编程中应尽可能地用移位运算代替乘除运算.  

我们知到右移是分为算数右移和逻辑右移.  

算数右移:  最右边的二进制位丢弃,  左边补原符号位(整数补0,  负数补1). 

逻辑右移:  最右边的二进制位丢弃,  左边补0. 

那我们程序中的 >> 是算数右移还是逻辑右移嘞,  我们可以用 -1 这个数来分析一波:  

 通过代码来测试结果即可:  

#include<stdio.h>
int main()
{
    int a = -1;
    a >>= 1;
    printf("%d", a);

    return 0;
}

 我们知道 >> 为算数右移时,  问题就显现出来了,  如果输入的整数是一个负数,  那么对该整数进行右移就会陷入死循环(无限地补符号位1嘛).  

1.3 常规解法

为了避免死循环,  我们不能右移输入的整数,  但是我们可以把与该整数进行按位与操作的 1 逐步左移,  直到 1 左移到为 0 时结束循环.

int hammingWeight(uint32_t n) {
    int i = 0;
    int count = 0;
    unsigned media = 1;
    while(media)
    {
        if(n&media)
        {
            count++;
        }
        media <<= 1;
    }
    return count;
}

1.4 思路优化

在优化之前,  我们先来分析一个二进制数减 1 的情况.  如果一个整数不等于0,  那么该整数的二进制表示中至少有一位是 1 . 假设这个数的最右边一位是 1 ,  那么减去 1 时,  最后一位变成 0 而其它位保持不变. 

接下来讨论最后一位不是 1 的情况:  如果该整数的二进制表示中最右边的 1 位于第 m 位,  那么减去 1 时,  第 m 位由 1 变成 0 ,  而第 m 位之后的 0 都变成 1 ,  整数中第 m 位之前的所有位保持不变.  例如对于二进制序列 1100,  它的第二位(最开始是第0位嘛)是最右边的 1 .  减去 1 之后,  第二位变成 0 ,  他后面的两位变成 1 , 而前面的 1 保持不变,  结果是 1011 (相当于把该整数二进制表示中的最右边的1和后面的二进制位取反了) .

接下来我们把 1100 减 1 的结果1011与原数 1100 做按位与的运算 得到结果:  1000 就将原来的整数的最右边的1给去掉了. 

于是我们得到一个重要的结论:  把一个整数减去 1 之后再和原来的E整数做按位与运算, 得到的结果相当于把整数的二进制表示中最右边的 1 变成 0 .

其实很好理解:  整数减 1 就相当于把该整数二进制表示中的最右边的1和后面的二进制位取反了,  在去与原数按位与,  当然抹去了最右边的 1 嘛 (不相同的两个二进制位做按位与得到的是0嘛).

int hammingWeight(uint32_t n) {
    int count = 0;
    while(n)
    {
        count++;
        n = (n-1)&n;
    }
    return count;
}

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

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

相关文章

电路方案分析(十五)符合 EMC 标准的汽车制动灯和尾灯设计方案

符合 EMC 标准的汽车制动灯和尾灯设计方案 tips&#xff1a;TI设计方案参考分析&#xff1a;TI Designs&#xff1a;TIDA-01374 1.系统描述 1.1关键参数 2.系统概述 2.1系统框图 2.2关键元器件 3.设计原理 3.1双重亮度设计 3.2 电荷泵设计 3.4 LED故障设计 3.3 MOSFET驱动电…

LeetCode Hot 100 笔记

文章目录链表21. 合并两个有序链表栈20. 有效的括号Java栈链表 链表的题目一般都不太难&#xff0c;画图&#xff0c;别怕麻烦 21. 合并两个有序链表 解法一&#xff1a;迭代 用一个指针cur跟踪当前节点&#xff0c;每次从list1和list2中选取小的节点&#xff0c;链接起来建…

什么是轻量化,轻量化模型is all your need hhh

其实学了几个小月&#xff0c;我们肯定知道&#xff0c;MLP有多deeper &#xff0c;卷积层有多少层呀 抑或是Transformer架构&#xff0c;大量的参数&#xff0c;只能用huge 来描述&#xff0c; 可实际上我们的设备&#xff0c;有时候并没有服务器那么厉害&#xff0c;所以人…

阿里云认证为什么那么多人考?考试内容难不难?

我国人口密集&#xff0c;每年有大量的毕业生涌进社会&#xff0c;除此之外还有很多进入社会很久的打工人&#xff0c;想要跳槽&#xff0c;到更加挣钱的岗位&#xff0c;待遇更好的公司去。为了能够早日买房、买车&#xff0c;很多人会选择社会热门行业去学习&#xff0c;甚至…

sqli-labs 第七关 多命通关攻略

sqli-labs 第七关 多命通关攻略描述字符串与数值之间的转换判断注入类型返回结果正常输入不正常输入错误输入总结判断注入类型判断是否为字符型注入判断是否为单引号字符型注入判断是否为双引号字符型注入判断是否为数值型注入总结判断注入类型&#xff08;修正版&#xff09;字…

二十六、Docker (2)

&#x1f33b;&#x1f33b; 目录一、Docker的常用命令 (阶段A)1.1 帮助命令1.2 镜像命令1.3 容器命令1.3.1 新建容器并启动1.3.2 列出所有运行的容器1.3.3 退出容器1.3.4 删除容器1.3.5 启动和停止容器的操作1.4 常用的其它命令1.4.1 后台启动容器1.4.2 查看日志1.4.3 查看容器…

如何搭建私域流量?

如今已经进入存量用户时代&#xff0c;越来越多的企业也明白了存量用户的重要性&#xff0c;因此企业都非常重视私域流量的搭建&#xff0c;以挖掘客户的价值。 前言 如今已经进入存量用户时代&#xff0c;越来越多的企业也明白了存量用户的重要性&#xff0c;因此企业都非常重…

安卓搭建好的模拟机,为调试准备

​ 这一节直接分享制作好的虚拟机&#xff0c;镜像系统&#xff0c;以及安卓源码&#xff0c;直接节省你的时间去配置&#xff0c;编译。 下来我来分享下搭建步骤&#xff1a; 1 虚拟机下载vm 12 pro &#xff0c;这个网上百度就可以&#xff0c;原则13,14也都是可以的。 2 下…

移动魔百盒CM311-3-YST-晨星MSO9385-语音首页正常-TTL刷机包

移动魔百盒CM311-3-YST-晨星MSO9385-语音首页正常-TTL刷机包 固件特点&#xff1a; 1、三网通用&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升级&#xff1b; 4、大量精简内置的没用…

熬夜搞了 17000 字,终于把你这个 ES 玩明白了

平常经常用ES(ElasticSearch), 觉得这真是个好玩意儿&#xff0c;所以来分享一篇文章&#xff0c;希望通过这篇文章能让读者大致了解ES是做什么的以及它的使用和基本原理。 可能有的读者航海不知道ES是个啥玩儿&#xff0c;别着急&#xff0c;看完本文后&#xff0c;相信你会了…

import...from... 和 require 如何找到模块位置?

import Vue from "vue"; 为什么不用写相对地址和绝对地址就能够导出 Vue 呢&#xff1f;似乎也没有配置路径&#xff1f;也没有配置映射&#xff0c;那么究竟 from "vue"; 对应的究竟是那个路径呢&#xff1f; 先提出两个可能的方案 1.VS Code/WebStorm …

【每天学习一点新知识】nmap端口扫描

nmap所识别的6个端口状态open(开放的)应用程序正在该端口接收TCP 连接或者UDP报文。发现这一点常常是端口扫描 的主要目标。安全意识强的人们知道每个开放的端口 都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。 而管理员则试图关闭它们或者用防火墙保护它们以免妨碍…

Java封装公共Result结果返回类

前言 在使用Java开发接口请求中&#xff0c;我们需要对请求进行进行统一返回值&#xff0c;这时候我们自己封装一个统一的Result返回类&#xff0c;下面就介绍下我用的这种的这个类 当然&#xff0c;也可以使用第三方库封装的Result结果返回类&#xff0c;根据个人喜好选择即可…

学习笔记之Vue脚手架(三)

&#xff08;三&#xff09;使用Vue脚手架 使用Vue脚手架&#xff08;三&#xff09;使用Vue脚手架一、创建Vue脚手架1.1 说明1.2 具体步骤二、分析脚手架结构2.1 配置文件2.2 src文件夹2.3 public文件夹一、创建Vue脚手架 1.1 说明 1.Vue脚手架是Vue官方提供的标准开发工具&…

电脑技巧:分享常用的电脑快捷键

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Nutanix 替代专题 | SmartX 与 Nutanix 超融合市场、技术与性能对比

2022 年 8 月 19 日&#xff0c;Nutanix&#xff08;路坦力&#xff09;宣布中国市场自 2023 财年起将转型为合作伙伴销售主导模式&#xff0c;引起了广泛关注&#xff1b;同时结合当前 IT 基础架构的国产化趋势背景&#xff0c;不少正在使用和考虑使用 Nutanix 产品的企业开始…

js 跨域访问问题解决方法

什么引起了ajax不能跨域请求的问题&#xff1f; ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互&#xff0c;而浏览器出于安全考虑&#xff0c;不允许js代码进行跨域操作&#xff0c;所以会警告。 有什么完美的解决方案么&#xff1f; 解决方案有不少&#xff0c;但…

数字化门店管理|如何让门店数字化管理,更加贴合日常运营细节?

在赋能品牌门店数字化管理的过程中&#xff0c;帷幄既注重前沿 AI 算法带来的技术驱动力&#xff0c;也注重基于门店管理中的真实场景与需求&#xff0c;让算法更贴合业务实际需求&#xff0c;从而带来运营优化与降本增效。 1 月&#xff0c;「帷幄数智空间 Whale SpaceSight」…

植物大战 动态内存——C++

这里是目录标题前言动态内存分布如何理解C语法的增加newnew用法关于struct和class的使用关于free和delete的区别。背会这句话抛异常operator new和operator delete内存池new和delete原理定位newmalloc和new的区别是什么&#xff1f;内存泄漏前言 总结复习前面的知识。 注意&a…

一文带你了解什么是云计算网络运维工程师,以及2023年的就业前景

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.云计算网络运维工程师是做什么的? 二.作为一名云计算网络运…