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 }
  • 相关阅读:
    绝对差不超过限制的最长连续子数组
    单调栈的认识及其应用
    寻找两个正序数组的中位数寻找两个正序数组的中位数
    JVM垃圾回收机制和python的垃圾回收
    K 个不同整数的子数组
    python中闭包
    2021/2/8_ 最长湍流子数组
    python中的函数
    python中可变类型与不可变类型 + 类型转换
    python的元组
  • 原文地址:https://www.cnblogs.com/raichen/p/5639453.html
Copyright © 2011-2022 走看看