programacion - ¿Cómo compruebo si un entero es par o impar usando operadores bitwise?
operadores a nivel de bits en c (8)
Considere lo que significa "par" y "impar" en términos de "bit". Como los datos enteros binarios se almacenan con bits que indican múltiplos de 2, el bit de orden más bajo corresponderá a 2 0 , que es por supuesto 1, mientras que todos los otros bits corresponderán a múltiplos de 2 (2 1 = 2, 2 2). = 4, etc.). Arte ASCII gratuito:
NNNNNNNN |||||||| |||||||+−− bit 0, value = 1 (20) ||||||+−−− bit 1, value = 2 (21) |||||+−−−− bit 2, value = 4 (22) ||||+−−−−− bit 3, value = 8 (23) |||+−−−−−− bit 4, value = 16 (24) ||+−−−−−−− bit 5, value = 32 (25) |+−−−−−−−− bit 6, value = 64 (26) +−−−−−−−−− bit 7 (highest order bit), value = 128 (27) for unsigned numbers, value = -128 (-27) for signed numbers (2''s complement)
Solo he mostrado 8 bits allí, pero entiendes la idea.
Así que puedes saber si un entero es par o impar mirando solo el bit de orden más bajo: si está configurado, el número es impar. Si no, es parejo. No te importan los otros bits porque todos denotan múltiplos de 2, por lo que no pueden hacer que el valor sea impar.
La forma en que se ve ese bit es utilizando el operador AND de su idioma. En C y en muchos otros idiomas derivados sintácticamente de B (sí, B), ese operador es &
. En los BASICs, suele ser And
Tomas tu entero, Y lo haces con 1 (que es un número con solo el bit de orden más bajo establecido), y si el resultado no es igual a 0, el bit fue establecido.
Intencionalmente no estoy dando el código aquí, no solo porque no sé qué idioma está usando, sino porque marcó la pregunta "tarea". :-)
¿Cómo compruebo si un entero es par o impar usando operadores bitwise?
En C (y la mayoría de los lenguajes similares a C)
if (number & 1) {
// It''s odd
}
Puedes hacerlo simplemente usando bitwise AND &
operator.
if(num & 1)
{
//I am odd number.
}
Lea más aquí - Verificación incluso impar utilizando el operador bitwise en C
Solo una nota a pie de página de la respuesta de Jim.
En C #, a diferencia de C, bitwise AND devuelve el número resultante, por lo que querría escribir:
if ((number & 1) == 1) {
// It''s odd
}
También en Java, tendrá que usar if((number&1)==1){//then odd}
, porque en Java y C # como lenguajes, el int
no se convierte en boolean
. Tendrá que usar los operadores relacionales para devolver un valor boolean
, es decir, true
y false
diferencia de C y C ++, como idiomas que tratan el valor no cero como true
.
#include <iostream>
#include <algorithm>
#include <vector>
void BitConvert(int num, std::vector<int> &array){
while (num > 0){
array.push_back(num % 2);
num = num / 2;
}
}
void CheckEven(int num){
std::vector<int> array;
BitConvert(num, array);
if (array[0] == 0)
std::cout << "Number is even";
else
std::cout << "Number is odd";
}
int main(){
int num;
std::cout << "Enter a number:";
std::cin >> num;
CheckEven(num);
std::cout << std::endl;
return 0;
}
if (number & 1)
number is odd
else // (number & 1) == 0
number is even
Por ejemplo, tomemos el entero 25, que es impar. En binario 25 es 00011001
. Observe que el bit menos significativo b0 es 1.
00011001 00000001 (00000001 is 1 in binary) & -------- 00000001
if(x & 1) // ''&'' is a bit-wise AND operator
printf("%d is ODD/n", x);
else
printf("%d is EVEN/n", x);
Ejemplos:
For 9:
9 -> 1 0 0 1
1 -> & 0 0 0 1
-------------------
result-> 0 0 0 1
Entonces 9 Y 1 nos da 1, ya que el bit más correcto de cada número impar es 1.
For 14:
14 -> 1 1 1 0
1 -> & 0 0 0 1
------------------
result-> 0 0 0 0
Así que 14 Y 1 nos da 0, ya que el bit más correcto de cada número par es 0.