10

xiaoxiao2021-02-28  170

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

基本思路1(不可行):先判断整数二进制表示中最右边的一位是否为1,接着把整数右移一位,再判断该位是否为1.这样每次移动一位,直至整个整数变成0为止。

如何判断一个整数的最右边一位是否为1:如果一个整数与1做与运算结果为1,则整数最右边一位为1。

该方法会导致出现死循环。当把一个负数右移一位时,不是简单的把最高位的1移到第二位,而是最高位继续补上1.如果一直做右移运算,做种会变成0xFFFFFFFF而陷入死循环。

基本思路2(可行):为避免死循环,可以选择不右移输入的数字,而是把要进行与运算的1不断左移。

基本思路3(可行):把一个整数的减去1,再和原整数做与运算,会把该整数最右边的1变成0。那么一个整数可以进行多少次这样的运算,就有多少个1。

import java.util.Scanner; public class NumberOf1 { //基本思路2 public static int numberOf1_1(int n) { int count = 0; int flag = 1; while(flag!=0){ if((n & flag)!=0) count++; flag = flag << 1; } return count; } //基本思路3 public static int numberOf1_2(int n) { int count = 0; while(n!=0){ ++count; n = (n - 1) & n; } return count; } public static void main(String[] args) { System.out.print("请输入一个十进制整数:"); Scanner sc = new Scanner(System.in); int sc1 = sc.nextInt(); System.out.println("该数的二进制为:"+Integer.toBinaryString(sc1)); System.out.println("思路1:该数的二进制中包含1的个数为:"+numberOf1_1(sc1)); System.out.println("思路2:该数的二进制中包含1的个数为:"+numberOf1_2(sc1)); sc.close(); } }

转载请注明原文地址: https://www.6miu.com/read-45855.html

最新回复(0)