2010-08-15 3 views
0

다음 구조를 int64에 맞춰야합니다.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) 

이러한 구조를 int64에 맞게 만들려면 어떻게해야합니까? 모든 항목은 숫자이며 지정된 비트 크기입니다

+0

이 옵션에 대한 계산을 수행 했습니까? 직접 할당하지 않는 한, 호스트가 네트워크에 연결되면 호스트 이름 부분은 충돌 가능성이 50 %입니다. 랜덤 부분은 512 초가 동일한 "초"에서 생성 될 때 충돌 확률이 50 %입니다. 이는 시계 드리프트와 수정으로 인해 실제 * 초 *보다 길 수 있습니다. –

+0

512 개의 ID가 생성되면 실제로는 0.19 퍼센트입니다. 호스트 이름은 해시에 의해 할당되므로 무작위가 아니므로 모든 다른 호스트 이름을 가정하면 순수 임의성보다 낮을 수 있습니다. 하지만 다른 포스트에서 말했듯이 호스트 이름의 비용에 따라 난수를 늘릴 것입니다. –

답변

7

은 그냥 적절한 변화와 구성 요소를 함께 비트 단위 또는.

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

이동 및 붙여 넣기를 통해 문제를 해결하십시오.

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

구성 요소가 int64s 인 것 같습니다. –

7

일반적으로 구조는 하나의 int64 필드와 해당 필드의 관련 비트에 액세스하는 여러 속성으로 선언됩니다. 그래서 같은

:

struct MyStruct 
{ 
    int64 _data 

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

나는 재산 아이디어를 좋아한다. 그것은 비트 필드처럼 단순하다. –

4

당신은이 두 가지 옵션에 대해 C++과 C#이라는 태그를 달았습니다.

C에서 당신은 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) 
}; 

을 C#에서 다른 답변에서와 같이 자신을 비트 - 이동에 당신이해야합니다.