2010-08-15 5 views
0

Je dois adapter la structure suivante à int64.Comment adapter une structure dans un int64?

day 9 bit (0 to 372) 
year 8 bit (2266-2010 = 256 y) 
seconds 17 bit (24*60*60=86400 s) 
hostname 12 bit (2^12=4096) 
random 18 bit (2^18=262144) 

Comment faire pour que cette structure s'intègre dans un int64? Tous les éléments sont numérotés et de la taille de bit spécifiée

+0

Avez-vous fait le calcul pour cette option? Votre partie de nom d'hôte aura 50% de chances de collision une fois que 64 hôtes seront dans le réseau, sauf si vous les attribuez à la main. La partie aléatoire a 50% de chances de collision lorsque 512 identifiants sont générés dans la même "seconde" - ce qui, en raison des dérives et des corrections de l'horloge, peut être plus long qu'une * seconde * réelle. –

+0

c'est en fait 0,19% lorsque 512 ID sont générés. Le nom d'hôte est assigné par hachage, donc il n'est pas aléatoire, donc c'est gonnna être plus bas qu'avec un caractère purement aléatoire, en supposant que tous les noms d'hôte différents. Mais comme je l'ai dit dans l'autre post, je vais probablement augmenter le nombre aléatoire sur le coût du nom d'hôte. –

Répondre

7

Juste ou les niveau du bit des composants ainsi que des changements appropriés.

int64 combined = random | (hostname << 18) | (seconds << (18+12)) ... etc. 

Déplacez-les en les déplaçant et en les enfoncant.

random = combined & 0x3FFFF 
hostname = (combined >> 18) & 0xFFF; 
etc. 
+0

Les composants étant int64s, je suppose? –

7

Généralement, vous devez déclarer une structure avec un champ int64 et plusieurs propriétés qui accèdent uniquement aux bits pertinents de ce champ.

Donc, comme:

struct MyStruct 
{ 
    int64 _data 

    public short Day 
    { 
     get { return (short)(_data >> 57); } 
    } 
} 
+0

J'aime l'idée de propriété - le rend aussi simple qu'un bitfield. –

4

Vous avez étiqueté ce C++ et C#, des options très différentes pour ces deux.

En C++, vous pouvez utiliser bit-fields:

// from MSDN 
struct Date 
{ 
    unsigned nWeekDay : 3; // 0..7 (3 bits) 
    unsigned nMonthDay : 6; // 0..31 (6 bits) 
    unsigned nMonth : 5; // 0..12 (5 bits) 
    unsigned nYear  : 8; // 0..100 (8 bits) 
}; 

En C#, vous aurez à vous déplacer bits, comme dans les autres réponses.

Questions connexes