2735 - Insert Biti

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerință

Se citesc trei numere naturale n m i. Să se schimbe valorile biților lui n de la poziția i spre stânga, cu valorile biților lui m de la 0 până la cel mai semnificativ bit de 1 din m și apoi să se afișeze n.Numerotare biților se face de la dreapta spre stânga începând de la 0.

Date de intrare

Programul citește de la tastatură numerele n, m și i, separate prin spații.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse." Programul citește de la tastatură numerele n, m și i, separate prin spații. În caz contrar, se va afișa pe ecran: "Datele de intrare nu corespund restricțiilor impuse."

Restricții de precizări

  • numerele n, m sunt se reprezintă pe 64 de biți, fără semn.
  • pozițiile biților sunt indexate de la 0.

Exemplul 1

Intrare
5
6
2
Ieșire
Datele introduse corespund restricțiilor impuse.
13

Exemplul 2

Intrare
10101
111
3
Ieșire
Datele introduse corespund restricțiilor impuse.
53

Rezolvare ver. 1

def validare(n, m, i):
    return n.isdigit() and m.isdigit() and i.isdigit() and 1 <= int(n), int(m), int(i) <= pow(2, 63)


def lg_bit(n):
    return n.bit_length()


def insertbiti(n, m, i):
    # Gasim poziția celui mai semnificativ bit de 1 din m
    poziția = lg_bit(m) - 1

    # Creăm o mască pentru a șterge biții lui n
    mask = (1 << i) - 1

    # Ștergem biții lui n de la poziția i în stânga
    n &= mask

    # Copiem biții lui m în n
    n |= (m >> (poziția + 1 - i)) << i

    # Returnăm n-ul rezultat
    return n


if __name__ == "__main__":
    n = input("Introduceti n: ")
    m = input("Introduceti m: ")
    i = input("Introduceti i: ")

    if validare(n, m, i):
        n = int(n)
        m = int(m)
        i = int(i)

        print("Datele introduse corespund restricțiilor impuse.")
        rezultat = insertbiti(n, m, i)
        print("Rezultatul este:", rezultat)

    else:
        print("Datele introduse nu corespund restricțiilor impuse.")