Domanda Perché muovere il bit?


Recentemente stavo guardando un file di configurazione che stava salvando alcuni valori criptici. Mi è capitato di avere la fonte disponibile, quindi ho dato un'occhiata a quello che stava facendo, e stava salvando un sacco di valori diversi e li ho spostati l'uno nell'altro. Mi ha disorientato il motivo per cui qualcuno lo farebbe. La mia domanda, quindi, è: c'è un ovvio vantaggio nell'archiviazione di dati numerici in questo modo? Riesco a vedere come potrebbe essere un valore leggermente più piccolo da memorizzare, in termini di byte, ma sembra che ci sia un sacco di lavoro per salvare un paio di byte di spazio. Sembra anche che sarebbe molto più lento.

L'altra possibilità che mi è venuta in mente è che è stato usato per scopi di offuscamento. questo è un uso comune del cambio di bit?


10
2017-09-22 18:39


origine


risposte:


Lo spostamento dei bit sembra più comune nei linguaggi a livello di sistema come C, C ++ e assembly, ma l'ho visto anche qui in C #. Non è spesso usato così tanto per risparmiare spazio, tuttavia, come lo è per uno (o entrambi) due motivi tipici:

  • Stai parlando con un sistema esistente (o utilizzando un protocollo stabilito o generando un file in un formato noto) che richiede che le cose siano disposte in modo molto preciso; e / o
  • La combinazione di bit comprende un valore che è di per sé utile per il test.

Chiunque lo usi in un linguaggio di alto livello unicamente risparmiare spazio o offuscare il loro codice è quasi sempre prematuramente ottimizzante (e / o è un idiota). Il risparmio di spazio raramente giustifica la complessità aggiunta e i cambiamenti di bit non sono abbastanza complessi da impedire a qualcuno determinato a comprendere il codice.


5
2017-09-22 19:03



Questo è uno degli usi comuni del cambio di bit. Ci sono diversi vantaggi:

1) Le operazioni di cambio bit sono veloci.

2) È possibile memorizzare più flag in un singolo valore.

Se hai un'app che ha diverse funzionalità, ma vuoi che alcune (configurabili) siano abilitate, puoi fare qualcosa del tipo:

[Flags]
public enum Features
{
    Profile = 1,
    Messaging = 1 << 1,
    Signing = 1 << 2,
    Advanced = 1 << 3
}

E il tuo unico valore per abilitare Messaging e Advanced sarebbe:

(1 << 1) + (1 << 3) = 2 + 16 = 18

<add name="EnabledFeatures" value="18" />

E poi per capire se una determinata funzionalità è abilitata, devi semplicemente eseguire una semplice matematica bit a bit:

var AdvancedEnabled = 
    EnabledFeatures & Features.Advanced == Features.Advanced;

11
2017-09-22 18:41



Ho un progetto che memorizza la matrice giorno / ora delle ore disponibili durante una settimana. Quindi ha valori 24x7 che devono essere memorizzati in qualche modo.

Ho scelto di memorizzarlo come 7 pollici, quindi ogni giorno è rappresentato da un intero e ogni ora in esso come un bit. Solo un esempio in cui può essere utile.

enter image description here


4
2017-09-22 18:44



A volte (specialmente nelle vecchie programmazioni di Windows), ci saranno informazioni codificate in bit di "ordine elevato" e "basso ordine" di un valore ... ea volte è necessario spostarsi per ottenere l'informazione. Non sono sicuro al 100% delle ragioni alla base di questo, a parte il fatto che potrebbe rendere conveniente restituire un valore a 64 bit con due valori a 32 bit codificati in esso (in modo da poterlo gestire con un singolo valore di ritorno da un metodo chiamata).

Sono d'accordo con le tue affermazioni sulla complessità inutile, però, non vedo molte applicazioni al di fuori di roba di cricking / crunch di numeri davvero pesanti in cui ciò sarebbe necessario.


1
2017-09-22 22:57