1. 程式人生 > >一個整數二進位制表示中1的個數 java實現

一個整數二進位制表示中1的個數 java實現

題目:輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。

題目解析:最直觀的解法是先判斷整數二進位制表示中最右邊以為是不是1.接著把整數右移一位(這邊用右移不用除以2,是因為除法運算效率比移位運算要低得多),這樣每次移動一位,直到整數為0.但是這樣子會有一個問題,當輸入是一個負整數,由於負整數最高位是1,右移一位後必須保持最高位還是1,這樣一直死迴圈下去,因為移位後的數永遠不會為0,最高位都是1,而且這個數最終會變成0XFFFFFFFF。所以不能單純的用移位運算,或者不能在原數上做移位運算。可以對另一個比較數採取移位運算:

a.首先讓原數與flag=1作與運算,結果為0表示最右邊移位為0,不為0表示最右邊移位為1;

b.將flag左移一位,繼續上一步。

c.直到flag=0;

這是通常採用的方式,但是要判斷32位(因為整數4個位元組,32位);

下面介紹一種判斷次數少的方法(或者只判斷1的個數次):

演算法思想:把一個整數減去1,在與原數做與運算,會把該整數最右邊的1變成0(例如原數1100,減1得1011,做完與運算後得1000.).那麼一個整數的二進位制表示中有多少個1 ,就可以進行多少次這樣的操作。總操作明顯小於上一個方法。

演算法原始碼;

public class Solution {
    public static int NumberOf1(int n) {
int count=0;
        while(n!=0){
            count++;
            n=(n-1)&n;
        }
        return count;
    }

public static void main(String[] args){

System.out.println(NumberOf1(8));

}
}

相關推薦

一個整數二進位制表示1個數 java實現

題目:輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。 題目解析:最直觀的解法是先判斷整數二進位制表示中最右邊以為是不是1.接著把整數右移一位(這邊用右移不用除以2,是因為除法運算效

判斷一個整數二進位制表示1個數/////////////質數判斷

一、一個正整數二進位制表示中“1”個數 java程式碼實現 //演算法一----快速法 public Class Solution { public int NumberOf1(int n) { int count=0;

計算1個數--計算一個整數二進位制1個數。要求效率儘可能的高。且能正確求正數和負數的二進位制1個數

錯誤方法: 數字右移,這裡會涉及到移位的規則。 移位規則: 左移運算子m<<表示把m左移n位。左移n位的時候,最左邊的n位將被丟棄,同時在右邊補上n個0; 右移比左移稍微複雜一些,如果數字是一個無符號值或正數,右移時最左邊補0; 如果數字是

c語言:統計整數二進位制表示1個數(漢明重量)

問題描述:對於一個位元組的無符號整型變數,求其二進位制表示中1的個數。第一次見到這個問題應該是icephone第一次例會的時候,問題雖然簡單,但也值得深思。後來查閱資料的時候才知道這個問題有個正式的名字叫Hamming_weight,也被一些公司當做面試題。下面通過幾個不同階

求無符號整數二進位制表示1個數

簡單粗暴的方法: 和1取與,計數然後移位。 int OnesNumber(unsigned int n) { int count = 0; while(n!=0) { if(n&1==1)//末尾是否為1 count

Java實現輸入一個整數,輸出該數二進位制表示1個數

public class Test { // 利用Java內建toBinaryString方法來實現 public static int numberOfOne1(int n) { int count = 0; String

【劍指offer】輸入一個整數,輸出該數二進位制表示1個數,其中負數用補碼錶示。

題目要求 輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。 核心思路 如果一個整數不為0,那麼這個整數至少有一位是1,如果把這個整數減1,那麼原來整數最右邊的1就會變為0,原來在1右邊的所有0都會變為1。那麼,利用n = n & (n - 1),

【C語言】輸入一個整數,輸出該數二進位制表示1個數(三種方法)

輸入一個整數,輸出該數二進位制表示中1的個數。如輸入32,輸出1.程式碼實現:方法1:與運算#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; int FindOne

【程式設計之美】任意給定一個32位無符號整數n,求n的二進位制表示1個數

任意給定一個32位無符號整數n,求n的二進位制表示中1的個數,比如n = 5(0101)時,返回2,n = 15(1111)時,返回4。這也是一道比較經典的題目了,相信不少人面試的時候可能遇到過這道題吧,我今天就遇到了,當時懵了。現在想想多簡單,浪費了一次機會。 1.普通法

輸入一個整數,輸出該數二進位制表示1個數。其中負數用補碼錶示。

如何求二進位制中1的個數(三種方法) 思路:1.在32位中,二進位制表示數字1方式為 00000000 00000000 00000000 00000001 首先我們的第一個方法就是一位一位的找,從左

leetcode_461. Hamming Distance 計算漢明距離,按位異或運算,計算整數二進位制表示1個數 java

題目: The Hamming distance between two integers is the number of positions at which the corresponding bits are different. Given two int

演算法—輸入一個整數,輸出該數二進位制表示1個數。其中負數用補碼錶示

輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示! 明確幾點: 計算機中資料儲存形式位二進位制位。 正數以原碼形式儲存 負數以補碼形式儲存 int型別資料,佔4個位元組,一個位元組8位,所以int型別佔32個二進位制位。 比如:9的原碼位 

使用Haskell計算一個整數二進位制表示最大的連續的1個數

source: https://www.hackerrank.com/challenges/30-binary-numbers module Main where countMine :: Int -> Int -> Int countMine c n | n

python輸入一個整數,輸出該數二進位制表示1個數

# -*- coding:utf-8 -*-classSolution:defNumberOf1(self, n):# write code here cnt =0if n<0: n = n &0xffffffffwhil

輸入一個整數,輸出該數二進位制表示1個數。其中負數用補碼錶示

思路:用位運算來做,與1,第一位保持不變,前面的置0,然後判斷,再右移 class Solution { public: int NumberOf1(int n) { int i = 0; int count = 0;

10.輸入一個整數,輸出該數二進位制表示1個數。其中負數用補碼錶示。

題目:輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。 因為線上筆試的話時間有限,本人也不一定寫的對,這裡就直接呼叫庫函式來將整數轉換成對應的二進位制表示了 public class

輸入一個整數,輸出該數二進位制表示1個數(其中負數用補碼錶示)--《劍指offer》

題目描述 輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。 有兩種解題思路: 1.因為題目給出的是int型別,java中的int型別用32位表示,把這個數依次無符號右移(考慮到負數

一個整數二進位制表示1個數

給定一個整數,判斷其二進位制表示中1的個數。 第一種比較直接的思路是 1. 把這個數的低位與1取與運算, 2. 再把這個數右移1位, 3. 返回1, 結果:統計這個過程中1的個數。 但這種思路存在一個

int abs(int number)函式有感: 求補碼和通過補碼求對應的整數 C++(增加:數字的二進位制表示1個數)

#include "limits.h" #include "math.h" int abs(int number) { int const mask = number >> (si