一个数字在二进制下的1的个数

一个数字在二进制下的1的个数.
把一个整数在二进制下的1有多少个

#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int cnt = 0;
while (n > 0)
{
cnt += n % 2;
n/=2;
}
printf("%d", cnt);
return 0;
}

可以用这个



__builtin_popcount()

要计算一个整数在二进制下的1的个数,可以使用位运算的方法。以下是一个示例代码:

def count_ones(n):
    count = 0
    while n:
        count += n & 1
        n >>= 1
    return count

num = 10
print(count_ones(num))  # 输出结果为2

在这个示例中,我们使用了一个循环来遍历整数的每一位。通过将整数与1进行按位与运算,可以判断最低位是否为1。如果是1,则计数器加1。然后,将整数右移一位,继续判断下一位。重复这个过程,直到整数变为0。

你可以将要计算的整数赋值给num变量,并调用count_ones函数来获取结果。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7566761
  • 你也可以参考下这篇文章:判断一颗树是否为完全二叉树(利于二叉树的递归调用)
  • 除此之外, 这篇博客: 如何判断一颗二叉树中的结点所在的深度中的 在一棵二叉链表表示的二叉树中,求结点的深度。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    设这样的一颗二叉树,深度为4,假设就D这个结点所在的深度
    设这样的一颗二叉树,深度为4,假设就D这个结点所在的深度


    1. 首先判断他的根节点是否为空,若为空,则报空指针异常;

    2. 定义一个队列将他的根节点放入,随后加上一个标志位"#",表示这一行的结点已经遍历完毕,由于根节点已经进入队列,所以令level = 1;

    3. 随后进入循环,判断这个队列是否为空,如果队列为该标志位,则终止循环,如果队列不为空,则执行下列循环;

    4. 队列结点出队,如果说出队的结点为为该标志位并且队列不为空(如果队列为空,则表示他的遍历已经结束),则level + 1,并且把该标志位重新放入队列中,如果出队的结点不是该标志位,则判断他的左右孩子是否为空,若不为空,则把该结点的左右孩子放入队列中,如果遍历到的结点为想要求结点层数的结点,则直接跳出循环,输出该值。


    代码实现如下:

    	/**
         * 判断该结点所在的层数,利用层序遍历的方法
         *
         * @param node 树结点
         */
        public void level(T node) {
            if (null == root)
                throw new NullPointerException("x == null");
            ArrayDeque<BinaryNode<T>> que = new ArrayDeque<>();
            BinaryNode<T> p = null;
            BinaryNode<T> emp = new BinaryNode<T>((T)"#");
            que.offer(this.root);
            que.offer(emp);
            int level = 1;
            while (!que.isEmpty()) {
                p = que.pop();
                if(p.data.equals(emp.data)){
                    if (que.isEmpty())
                        break;
                    que.offer(emp);
                    level++;
                }
                if(p.left != null )
                    que.offer(p.left);
                if(p.right != null)
                    que.offer(p.right);
                if (p.data.equals(node))
                    break;
            }
            System.out.println(level);
        }
    

    测试类如下:

    	public static void main(String[] args) {
    		// 声明一个数组,带空结点描述的二叉树的前序遍历
    		String[] prelist_1 = {
    				"A", 
    				"B", 
    				"D", 
    				null, 
    				"G", 
    				null, 
    				null, 
    				null, 
    				"C", 
    				"E", 
    				null, 
    				null, 
    				"F", 
    				"H", 
    				null, 
    				null, 
    				null
    		};
    		// 声明一个二叉树对象,将声明的数组传入进去
    		BinaryTree<String> bitee_1 = new BinaryTree<> (prelist_1);
    		System.out.print ("此树的结点的深度:");
    		bitee_1.level("B");
    	}
    

    运行结果
    此结点的深度

  • 您还可以看一下 刘磊老师的计算机进制转换课程中的 二进制的概念小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    解决方案:

    我们需要统计一个给定的十进制数字在其二进制表示下的1的个数。我们可以使用两种方法来解决这个问题。

    方法一: 递归实现十进制到二进制的转换 该方法使用递归的方式将十进制数字转换为二进制,并统计其中1的个数。

    #include<stdio.h>
    void to_binary(unsigned long n);
    int main(void)
    {
        unsigned long number;
        int count = 0;
        printf("Enter an integer (q to quit):\n");
        while (scanf("%lu", &number) == 1)
        {
            printf("Binary equivalent: ");
            to_binary(number, &count);
            putchar('\n');
            printf("Number of 1s in binary representation: %d\n", count);
            printf("Enter an integer(q to quit):\n");
            count = 0;
        }
        printf("Done.\n");
    
        return;
    
    }
    
    void to_binary(unsigned long n, int *count)
    {
        int r;
        r = n % 2;
        if (r == 1) {
            (*count)++;
        }
        if (n >= 2)
            to_binary(n / 2, count);
        putchar(r == 0 ? '0' : '1');
    
        return;
    }
    

    方法二: 使用位运算 该方法使用位运算的方式来统计二进制表示中1的个数。

    #include<stdio.h>
    int count_ones(unsigned long n);
    int main(void)
    {
        unsigned long number;
        int count = 0;
        printf("Enter an integer (q to quit):\n");
        while (scanf("%lu", &number) == 1)
        {
            count = count_ones(number);
            printf("Number of 1s in binary representation: %d\n", count);
            printf("Enter an integer(q to quit):\n");
            count = 0;
        }
        printf("Done.\n");
    
        return;
    
    }
    
    int count_ones(unsigned long n)
    {
        int count = 0;
        while(n)
        {
            count += n & 1;
            n >>= 1;
        }
        return count;
    }
    

    这样我们就可以统计给定的十进制数字在其二进制表示下的1的个数了。

    对于参考资料中的段落1和段落2,和本问题的要求关系不大,不需要使用到这些参考资料的内容来解决该问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^