• 二进制中1的个数 --剑指offer


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

    最开始想 和1做与运算 然后位右移 没有通过测试 是因为负数位右移用1来补位,导致判断没法终止。所以换一种方法

    还是和1做与运算,但是1位左移,一直到1位左移变成0为止,如果位运算结果不是0,计算结果➕1;

    public class Solution {
        public int NumberOf1(int n) {
            int base = 1;
            int sum=0;
            while(base != 0){
                if((n&base) != 0){
                    sum ++;
                }
                base=base << 1;
            }
            return sum;
        }
    }

    记录一种网上方法:

    把n减1然后和原先的n进行与运算,运算结果不为0说明有一个位为1,循环往复

    例:n的二进制表示为 1110 减1后为 1101 然后1110和1101进行与运算结果为1100 一次运算可以说明有一个1 ,这样下去就可以找到所有的1;

    public class Solution {
        public int NumberOf1(int n) {
            int count=0;
    //只要n不为0,就说明有一个位为1
    while(n!=0){ count ++; n = n&(n-1); } return count; } }
  • 相关阅读:
    290. Word Pattern
    283. Move Zeroes
    278. First Bad Version
    276. Paint Fence
    270. Closest Binary Search Tree Value
    [jobdu]二进制中1的个数
    [jobdu]丑数
    Skip List
    [wikioi]没有上司的舞会
    POJ3984 迷宫问题
  • 原文地址:https://www.cnblogs.com/nlw-blog/p/12417794.html
Copyright © 2020-2023  润新知