zoukankan      html  css  js  c++  java
  • 面试题10:二进制中1的个数

    面试题10:二进制中1的个数

    第一种解法是用1不断左移做与运算

    第二种解法是:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变为0

    把一个整数减去1后再和原来的数做与运算,得到的结果相当于把整数的二进制表示中最右边一个1变为0。很多二进制的问题都可以用这个思路解决。判断一个数是不是2的整数次方:减去1,再和原整数做与运算

     1 // NumberOf1InBinary.cpp : Defines the entry point for the console application.
     2 //
     3 
     4 // 《剑指Offer——名企面试官精讲典型编程题》代码
     5 // 著作权所有者:何海涛
     6 
     7 #include "stdafx.h"
     8 
     9 int NumberOf1_Solution1(int n)
    10 {
    11     int count = 0;
    12     unsigned int flag = 1;
    13     while(flag)
    14     {
    15         if(n & flag)
    16             count ++;
    17 
    18         flag = flag << 1;
    19     }
    20 
    21     return count;
    22 }
    23 
    24 int NumberOf1_Solution2(int n)
    25 {
    26     int count = 0;
    27 
    28     while (n)
    29     {
    30         ++ count;
    31         n = (n - 1) & n;
    32     }
    33 
    34     return count;
    35 }
    36 
    37 void Test(int number, unsigned int expected)
    38 {
    39     int actual = NumberOf1_Solution1(number);
    40     if(actual == expected)
    41         printf("Solution1: Test for %p passed.
    ", number);
    42     else
    43         printf("Solution1: Test for %p failed.
    ", number);
    44 
    45     actual = NumberOf1_Solution2(number);
    46     if(actual == expected)
    47         printf("Solution2: Test for %p passed.
    ", number);
    48     else
    49         printf("Solution2: Test for %p failed.
    ", number);
    50 
    51     printf("
    ");
    52 }
    53 
    54 int _tmain(int argc, _TCHAR* argv[])
    55 {
    56     // 输入0,期待的输出是0
    57     Test(0, 0);
    58 
    59     // 输入1,期待的输出是1
    60     Test(1, 1);
    61 
    62     // 输入10,期待的输出是2
    63     Test(10, 2);
    64 
    65     // 输入0x7FFFFFFF,期待的输出是31
    66     Test(0x7FFFFFFF, 31);
    67 
    68     // 输入0xFFFFFFFF(负数),期待的输出是32
    69     Test(0xFFFFFFFF, 32);
    70 
    71     // 输入0x80000000(负数),期待的输出是1
    72     Test(0x80000000, 1);
    73 
    74     return 0;
    75 }
  • 相关阅读:
    在宝塔中升级mysql版本
    测试winform程序到树莓派运行
    winserver2012远程桌面进入只有CMD窗口,无桌面解决方法
    一七年春末
    Linux 上通过rpm安装mysql
    Linux 上关于iptables
    Linux环境下安装JDK
    Linux上安装tomcat
    Linux 下安装redis
    Map集合按照value和key进行排序
  • 原文地址:https://www.cnblogs.com/raichen/p/5639453.html
Copyright © 2011-2022 走看看