zoukankan      html  css  js  c++  java
  • 剑指offer例题——二进制中1的个数

    题目:输入一个整数,输出该二进制表示中1的个数。其中负数用补码表示。

    首先明确补码的定义:

    原码 反码 补码

    将最高位作为符号位(0表示正,1表示负),

    其它数字位表达数值本身的绝对值的数字表示方式

    如果是正数,则表示方法和原码一样;

    如果是负数,符号位不变,其余各位取反。

    如果是正数,则表示方法和原码一样;

    如果是负数,则将数字的反码加上1

    (相当于将原码数值位取反然后在最低位加1)

    0的反码、补码都为零。

    原数 原码 反码 补码
    6 00000110 00000110 00000110
    -6 10000110 11111001 11111010

    代码:

    自己的代码:

     1 import java.lang.*;
     2 public class Solution {
     3     public int NumberOf1(int n) {
     4         String temp = Integer.toBinaryString(n);
     5         int len = temp.length();
     6         int zs = 0;
     7         int cur = len;
     8         if (n>0){
     9             for(int i = 0;i < cur; i++){
    10             char ch = temp.charAt(i);
    11             if(ch == '1')
    12                 zs = zs+1;
    13             }
    14             return zs;
    15         }
    16         else if(n == 0)
    17             return 0;
    18         else{
    19             int fz = 0;
    20             for(int j = len;j > 0 ; j--){
    21                 char ch = temp.charAt(j-1);
    22                 if(ch == '1')
    23                 {}
    24                 else
    25                 {
    26                     zs = zs + 1;
    27                     cur = j;
    28                     break;
    29                 }
    30             }
    31             for(int i = 0;i < cur; i++){
    32             char ch = temp.charAt(i);
    33             if(ch == '1')
    34                 zs = zs+1;
    35             }
    36             return zs;
    37         }
    38     }
    39 }

    运行总是报错,于是参考别人讨论中的方法,发现Java中自带这个函数:

    1 public class Solution {
    2     public int NumberOf1(int n) {
    3         return Integer.bitCount(n);
    4     }
    5 }

    能逮着耗子的就是好猫~Java学习的首要任务就是掌握其自带函数,这样才能更加省力地学习。

    同时学习了讨论中强推程序:

     1 public class Solution {
     2     public int NumberOf1(int n) {
     3         int count = 0;
     4         while(n!= 0){
     5             count++;
     6             n = n & (n - 1);
     7          }
     8         return count;
     9     }
    10 }

    这里是利用了一个二进制数字本身性质:

    链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8
    来源:牛客网
            如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。

            举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
    有待进一步研究~另外自己的示例是由问题的~
  • 相关阅读:
    Identity Server4 基础应用(一)Client Credentials
    AX2012 form displays unusually because of native resolution issues(由于本机高分辨率问题导致AX2012界面显示异常)
    AX视图View中添加静态方法
    AX2012导Demo数据
    AX多线程编译
    C# ListView用法详解 很完整
    用 C# 如何判断数据库中是否存在一个值
    ASCII码对照表
    C#中Chart的简单使用(柱状图和折线图)
    使用Filezilla Server配置FTP服务器
  • 原文地址:https://www.cnblogs.com/10081-AA/p/10544457.html
Copyright © 2011-2022 走看看