Cuente los bits establecidos en Bitwise XOR de todos los elementos adyacentes hasta N

Dado un número entero positivo N , la tarea es encontrar el recuento total de bits establecidos realizando Bitwise XOR en todos los elementos adyacentes posibles en el rango [0, N] .

Ejemplos:

Entrada: N = 4 
Salida:
Explicación: 
XOR bit a bit de 0 y 1 = 001 y conteo de bits establecidos = 1 
XOR bit a bit de 1 y 2 = 011 y conteo de bits establecidos = 2 
XOR bit a bit de 2 y 3 = 001 y conteo de bits establecidos = 1 
XOR bit a bit de 3 y 4 = 111 y recuento de bits establecidos = 3 
Por lo tanto, el recuento total de bits establecidos al realizar la operación XOR en todos los elementos adyacentes posibles del rango [0, N] = (1 + 2 + 1 + 3) = 7

Entrada: N = 7 
Salida: 11

 

Enfoque ingenuo: el enfoque más simple para resolver este problema es iterar sobre el rango [0, N] y contar todos los bits establecidos posibles realizando Bitwise XOR en cada elemento adyacente sobre el rango [0, N] . Finalmente, imprima el recuento total de todos los bits establecidos posibles.

Complejidad de tiempo: O(N * log 2 N)  
Espacio auxiliar: O(1)

Enfoque eficiente: Para optimizar el enfoque anterior, la idea se basa en las siguientes observaciones:

Si la posición del bit establecido más a la derecha de X es K , entonces el recuento de bits establecidos en (X ^ (X – 1)) debe ser K

Siga los pasos a continuación para resolver el problema:

  • Inicialice una variable, digamos bit_position para almacenar todos los valores posibles del bit más a la derecha en el rango [0, N] .
  • Inicialice una variable, digamos total_set_bits para almacenar la suma de todos los bits establecidos posibles realizando la operación Bitwise XOR en todos los elementos adyacentes posibles en el rango [0, N] .
  • Iterar sobre el rango [0, N] y Actualizar N = N – (N + 1) / 2 y total_set_bits += ((N + 1) / 2 * bit_position) .
  • Finalmente, imprima el valor de total_set_bits .

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to count of set bits in Bitwise
// XOR of adjacent elements up to N
int countXORSetBitsAdjElemRange1_N(int N)
{
 
    // Stores count of set bits by Bitwise
    // XOR on adjacent elements of [0, N]
    int total_set_bits = 0;
 
    // Stores all possible values on
    // right most set bit over [0, N]
    int bit_Position = 1;
 
    // Iterate over the range [0, N]
    while (N) {
        total_set_bits += ((N + 1) / 2
                           * bit_Position);
 
        // Update N
        N -= (N + 1) / 2;
 
        // Update bit_Position
        bit_Position++;
    }
 
    return total_set_bits;
}
 
// Driver Code
int main()
{
    int N = 4;
 
    cout << countXORSetBitsAdjElemRange1_N(N);
 
    return 0;
}

Java

// Java program to implement
// the above approach
import java.io.*;
import java.util.*;
   
class GFG{
   
// Function to count of set bits in Bitwise
// XOR of adjacent elements up to N
static int countXORSetBitsAdjElemRange1_N(int N)
{
     
    // Stores count of set bits by Bitwise
    // XOR on adjacent elements of [0, N]
    int total_set_bits = 0;
  
    // Stores all possible values on
    // right most set bit over [0, N]
    int bit_Position = 1;
  
    // Iterate over the range [0, N]
    while (N != 0)
    {
        total_set_bits += ((N + 1) / 2 *
                           bit_Position);
  
        // Update N
        N -= (N + 1) / 2;
  
        // Update bit_Position
        bit_Position++;
    }
    return total_set_bits;
}
   
// Driver Code
public static void main(String[] args)
{
    int N = 4;
  
    System.out.println(countXORSetBitsAdjElemRange1_N(N));
}
}
   
// This code is contributed by susmitakundugoaldanga

Python3

# Python3 program to implement
# the above approach
 
# Function to count of set bits in Bitwise
# XOR of adjacent elements up to N
def countXORSetBitsAdjElemRange1_N(N):
     
    # Stores count of set bits by Bitwise
    # XOR on adjacent elements of [0, N]
    total_set_bits = 0
 
    # Stores all possible values on
    # right most set bit over [0, N]
    bit_Position = 1
 
    # Iterate over the range [0, N]
    while (N):
        total_set_bits += ((N + 1) //
                            2 * bit_Position)
                             
        # Update N
        N -= (N + 1) // 2
 
        # Update bit_Position
        bit_Position += 1
 
    return total_set_bits
 
# Driver Code
if __name__ == '__main__':
     
    N = 4
     
    print(countXORSetBitsAdjElemRange1_N(N))
 
# This code is contributed by SURENDRA_GANGWAR

C#

// C# program to implement
// the above approach 
using System;
    
class GFG{
     
// Function to count of set bits in Bitwise
// XOR of adjacent elements up to N
static int countXORSetBitsAdjElemRange1_N(int N)
{
     
    // Stores count of set bits by Bitwise
    // XOR on adjacent elements of [0, N]
    int total_set_bits = 0;
   
    // Stores all possible values on
    // right most set bit over [0, N]
    int bit_Position = 1;
   
    // Iterate over the range [0, N]
    while (N != 0)
    {
        total_set_bits += ((N + 1) / 2 *
                           bit_Position);
   
        // Update N
        N -= (N + 1) / 2;
   
        // Update bit_Position
        bit_Position++;
    }
    return total_set_bits;
}
  
// Driver Code
public static void Main()
{
    int N = 4;
   
    Console.Write(countXORSetBitsAdjElemRange1_N(N));
}
}
 
// This code is contributed by code_hunt

Javascript

<script>
// Javascript program to implement
// the above approach
 
 
// Function to count of set bits in Bitwise
// XOR of adjacent elements up to N
function countXORSetBitsAdjElemRange1_N(N)
{
 
    // Stores count of set bits by Bitwise
    // XOR on adjacent elements of [0, N]
    let total_set_bits = 0;
 
    // Stores all possible values on
    // right most set bit over [0, N]
    let bit_Position = 1;
 
    // Iterate over the range [0, N]
    while (N) {
        total_set_bits += (Math.floor((N + 1) / 2) * bit_Position);
 
        // Update N
        N -= Math.floor((N + 1) / 2);
 
        // Update bit_Position
        bit_Position++;
    }
 
    return total_set_bits;
}
 
// Driver Code
let N = 4;
 
document.write(countXORSetBitsAdjElemRange1_N(N));
 
 
// This code is contributed by _saurabh_jaiswal
</script>
Producción: 

7

 

Complejidad temporal: O(Log 2 N)  
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por nk14646 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *