Codifica un numero firmato usando un alfabeto personalizzato

0

Quando si codifica una sequenza di bit in una stringa (utilizzando un alfabeto non ancora noto in fase di compilazione e con l'obiettivo che la stringa risultante sia il più breve possibile e che l'intero processo sia reversibile), è possibile utilizzare il "approccio divmod", vedi ad es questo post .

Da quanto ho capito, questa appraoch funziona solo con numeri positivi. Nel mio caso, voglio codificare interi con segno a 64 bit (Java Long ), quindi i numeri possono essere sia positivi che negativi.

Finora, ho usato un "trucco" per garantire che tutti i numeri siano positivi aggiungendo due nuovi bit: ho appena impostato il 65 ° bit su 1 e il 66 ° bit su 0. Ciò significa che i numeri positivi rimangono positivi e i numeri negativi diventano positivi (perché quelli principali del complemento a due sono cancellati). Tuttavia, questo approccio presenta due svantaggi:

  1. Ho bisogno di usare un BigInt poiché 64 bit non sono più sufficienti.
  2. Poiché il 65 ° bit è sempre 1, le stringhe risultanti non sono ovviamente le più brevi possibili.

Cos'altro posso fare per codificare un intero con segno a 64 bit? Esiste una variante del "divmod aprroach" che funziona con i numeri firmati?

    
posta ceran 11.08.2016 - 16:35
fonte

1 risposta

3

I possibili pattern di bit per un intero con segno a 64 bit sono esattamente gli stessi dei possibili pattern di bit per un intero senza segno a 64 bit. Pertanto, è possibile codificare ciascun pattern di bit sullo stesso output su cui lo si codificherà se fosse il pattern di bit di un intero senza segno. In altre parole: aggiungi 2 63 prima di codificare e sottrarre dopo la decodifica.

In realtà, dopo aver esaminato il link che hai fornito, è solo la conversione di base. Puoi rappresentare numeri negativi in qualsiasi base usando lo stesso "trucco" utilizzato dal complemento a due.

    
risposta data 11.08.2016 - 16:40
fonte

Leggi altre domande sui tag