[Java] 191. El número de bits 1 --- ¡revise los operadores de bits de Java para evitar un día de pisar el foso! ! !

Escribe una función, la entrada es un entero sin signo (en forma de cadena binaria), devuelve el número de dígitos en la expresión binaria de '1' (también conocido como peso de Hamming).

inmediato:

Tenga en cuenta que en algunos lenguajes (como Java), no hay ningún tipo de entero sin signo. En este caso, tanto la entrada como la salida se designarán como tipos de enteros con signo y no deberían afectar su implementación, porque la representación binaria interna es la misma independientemente de si el entero tiene o no signo.
En Java, el compilador usa la notación de complemento a dos para representar enteros con signo. Por lo tanto, en el ejemplo 3 anterior, la entrada representa un entero con signo -3.

Ejemplo 1:

Entrada: 00000000000000000000000000001011
Salida: 3
Explicación: En la cadena binaria de entrada 00000000000000000000000000001011, un total de tres bits son '1'.
Ejemplo 2:

Entrada: 00000000000000000000000010000000
Salida: 1
Explicación: En la cadena binaria de entrada 00000000000000000000000010000000, un total de un bit es '1'.
Ejemplo 3:

Entrada: 11111111111111111111111111111101
Salida: 31
Explicación: En la cadena binaria de entrada 11111111111111111111111111111101, un total de 31 bits son '1'.

inmediato:

La entrada debe ser una cadena binaria de longitud 32.

Avanzado:

Si llama a esta función varias veces, ¿cómo optimizaría su algoritmo?

复习;
a = 0011 1100

b = 0000 1101

-----------------

a&b = 0000 1100

a|b = 0011 1101

a^b = 0011 0001

~a = 1100 0011

下面的表中列出了按位运算符,假设整数变量A=60,变量B=13,那么 -

运算符

描述

示例

&

二进制AND运算符,如果存在于两个操作数中,则它会将结果复制到结果中。

A&B的结果为:12,也就是:0000 1100

Ι

二进制OR运算符,如果存在于任一操作数中,则复制一位。

A|B 的结果为:61,也就是:0011 1101

^

二进制异或运算符,如果在一个操作数中设置但不在两个操作数中设置,则复制该位。

A^B的结果为:49,也就是:0011 0001

~

二元一元补充运算符是一元的,具有“翻转”位的效果。

~A的结果为:-61,也就是:1100 0011

<<

二进制左移运算符,左操作数值向左移动右操作数指定的位数。

A << 2的结果为:240,也就是:1111 0000

>>

二进制右移运算符,左操作数值向右移动右操作数指定的位数。

A >> 2的结果为:15,也就是:1111

>>>

右移零填充运算符。 左操作数值向右移动右操作数指定的位数,移位值用零填充。

A >>>2的结果为:15,也就是:0000 1111
代码:
 public int hammingWeight(int n) {
    
    
    	 int sum=0;
		 for(int i=0;i<32;i++) {
    
    
			 if((n>>i&1)==1) {
    
    
				sum++; 
			 }
		 }
    	 return sum;  
    }

Supongo que te gusta

Origin blog.csdn.net/qq_44461217/article/details/115065929
Recomendado
Clasificación