Zamiana dwóch wybranych bitów w liczbie

Odpowiedz Nowy wątek
2019-08-12 03:00
0

Witam,
Jak w podanej przez użytkownika liczbie zamienic dwa wybrane(przez użytkownika) bity miejscami .

Pozostało 580 znaków

2019-08-12 09:27
2019-08-12 16:04
1

Jeśli chcesz edytować konkretne bity to najwygodniej będzie użyć std::bitset. Za pomocą operatora [] edytujesz konkretne bity jak tablicę. Na koniec wołasz to_ulong albo to_ullong i rzutujesz na wcześniejszy typ.

const int NUM = 10;
std::bitset<sizeof NUM> bits(NUM);
const bool tmp = bits[2];
bits[2] = bits[3];
bits[3] = tmp;

const int editedNum = static_cast<int>(bits.to_ulong());
edytowany 4x, ostatnio: several, 2019-08-12 18:34

Pozostało 580 znaków

2019-08-12 17:02
0

Można też bardziej generic

template< typename type >
type changeInteger( type number , pair<short int,short int> indices )
{
    if( !numeric_limits<type>::is_integer ||
         numeric_limits<type>::digits<=indices.first || numeric_limits<type>::digits<=indices.second ||
         indices.first<0 || indices.second<0 
      ) throw logic_error("Invalid parameters.");

    if( indices.first == indices.second ) return number;

    bitset<numeric_limits<unsigned long int>::digits> bits = {static_cast<unsigned long int>( number<0?(-1)*number:number )};

    bits[indices.first] = bits[indices.first]^bits[indices.second];
    bits[indices.second] = bits[indices.second]^bits[indices.first];
    bits[indices.first] = bits[indices.first]^bits[indices.second];

    return number<0?static_cast<type>(-1)*static_cast<type>(bits.to_ulong()):static_cast<type>(bits.to_ulong());
}
edytowany 4x, ostatnio: TomaszLiMoon, 2019-08-13 09:39

Pozostało 580 znaków

2019-08-12 18:31
0

@TomaszLiMoon: Twoja funkcja jest nie jest dobra, ponieważ niejawnie nie obsługuje typów innych niż całkowite, przez co dostaniemy wynik inny niż spodziewany, gdy użyjemy ją z typami zmiennoprzecinkowymi. Po operacjach na bitset możemy z powrotem otrzymać typ zmiennoprzecinkowy używając to_ullong() a potem zrobić memcpy bitów.

Powinieneś dodać jakiegoś static asserta pilnującego by przekazywane liczby nie były typu zmiennoprzecinkowego.

Poza tym daje ona niespodziewane rezultaty również dla prostych intów https://wandbox.org/permlink/x169fi9nzwnbP1cZ

edytowany 1x, ostatnio: several, 2019-08-12 18:34
Dziękuję za uwagi. Jeżeli chodzi o zamianę bitów dla typów zmiennoprzecinkowych przy użyciu bitset, to nie jest już tak łatwą sprawą jak w przypadku typów całkowitych. https://stackoverflow.com/que[...]ng-bitset-with-floating-types - TomaszLiMoon 2019-08-13 09:26

Pozostało 580 znaków

2019-08-12 19:50
Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0