热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c语言中把一个数缩小十倍_【动漫】作业帮面试题:求一个数的二进制中1的个数...

面试现场小夕:我先来说一下我的解法:1、先将数字转换成二进制字符串2、用String.split()函数存入一个数组中3、遍历数组跟1比较,
面试现场

66d0f0ea0a265fd7902aee091b34a765.pngeff41bd03eea2a6b47bed9a1d3a8d836.png

小夕:我先来说一下我的解法:

  • 1、先将数字转换成二进制字符串
  • 2、用String.split()函数存入一个数组中
  • 3、遍历数组跟1比较,同时计数
  • 4、输出计数值


public class Solution { 
    public int NumberOf1(int n) { 
        String s=Integer.toBinaryString(n); 
        String[] split=s.split(""); 
        int a=0; 
        for(int i = 0; i             if (split[i].equals("1")) 
           { a++; }
        } 
        return a; 
    } 
}

37421be5f426a2bc722124cc8d718828.png1147ff53d55fb0a5c9c7b4a6c6d1f411.png

一个例子
7111675b40d55e7c16b752e14c918ac7.png

助教:对于一个数12,求它的二进制中有几个1。count代表它里面有几个1。a6683ddd64b2e95716573be6e6a51cdd.png然后我将n和n-1的按位相与:9893b901f162d7b309f736d9ef20efc0.png7a2a732785594675c8f0d79ef2e51dab.pnge047a79b19a01f1ff11c4ca2a22e4a69.pngd253f52a99a4e3dd865482f448a5e54c.png

n是12,n-1是11,两者按位相与,n&n-1 = 8,n&n-1 它的二进制是1000。

到这里我们发现减1的结果是把最右边的一个1开始的所有位都取反了。也就是下图所示,全都取反了!9f3b47682b48d833872bd7e211747a2c.png这个时候如果我们再把原来的整数和减去1之后的结果做与运算(也就是n&n-1),从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000。也就是如下图所示:475ef198eb4adaea106ebe390a1df3df.png也就是说,把一个整数减去1,再和原整数做与运算(也就是n&n-1),会把该整数最右边一个1变成0.也就是如下图所示,n=12变成了n&n-1也就是变成8,12是1100,8是1000,12的二进制中最右边的1变成了0也就是成为了8。a7e8cd34386c6ae05d2ec9b2543904f1.png那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。好的接下来,让n=n&n-1,也就是n=8了,那么n-1是7,来继续求n&n-1。dbcb82736128f2de95a579fb9988d4a3.pngn继续和n-1按位相与得到的结果是0:b817da4852ccd83befbd0b07e41670b9.png最后由于结果为0,所以结束,一共进行了两次这样的操作,所以12二进制中有两个1。aeff38a37946808af1f17a0f6ec028e4.png

动画演示
c2555c2af300c4dec1b955958cf0a16d.gif
动画.GIF
五种语言实现

Java

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while (n != 0) {
            ++count;
            n = (n - 1) & n;
        }
        return count;
    }
}

Python

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        count = 0;
        if n 0:
            n = n & 0xffffffff
        while (n != 0):
            count += 1
            n = (n - 1) & n
        return count;

C++

class Solution {
public:
     int  NumberOf1(int n) {
        int count = 0;
        while (n != 0) {
            ++count;
            n = (n - 1) & n;
        }
        return count;
     }
};

PHP

     $count = 0;if($n 0){ // 处理负数
       $n = $n&0x7FFFFFFF;
       ++$count;
     }
     while($n != 0){
      $count++;
      $n = $n & ($n-1);
     }
     return $count;
}

JS

function NumberOf1(n){
    // write code here
    var count = 0;
    while (n != 0) {
        count++;
        n = (n - 1) & n;
    }
    return count;
}

475dea971f10d1d3a8d811659e70511d.png

【助教解释一下】n = n & 0xffffffff,在Python中,数的大小是可以无限扩大的,不会像Java或c++中,数超过32位会溢出,而是继续扩张,所以对于一个负数而言,进行了这个操作,实际上是提取了负数的后32位(在计算机中以补码形式存在),前面的任意位呢,则变成了0,比如说 -1,一开始是 111.....(n个1)...11111111,进行与运算之后,得到,00....(n个0)....111111111(32个1),变成了含32个1的正数,然后就不用担心负数陷入死循环。

f2681220a83fb3b2acec75c613b81f66.png
小夕絮叨

如果大家觉得文章不错,不妨点赞(在看)、转发支持一下小夕!冲鸭!我们下周再见。原创能坚持下去真的很难,各位的在看和转发真的是我的唯一动力了,不要让小夕放弃呀~~~

97461d3d0310f11e08736620801875ca.png         

57b066e5fc9ebdd2db016b55f911ea5b.png




推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
author-avatar
mobiledu2502877207
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有