2010-04-21 2 views
2

저는 이것이 매우 간단하다고 확신합니다. 그러나 나는 그것에 대한 주요 정신 블록을 가지고 있습니다. 그래서 여기에 약간의 도움이 필요합니다!배열의 마지막 N 비트를 설정하십시오.

5 개의 정수 배열을 가지고 있는데, 배열은 이미 일부 데이터로 채워져 있습니다. 배열의 마지막 N 비트을 임의의 잡음으로 설정하려고합니다.

[int][int][int][int][int] 

eg. set last 40 bits 

[unchanged][unchanged][unchanged][24 bits of old data followed 8 bits of randomness][all random] 

이 크게 언어 무신론자이지만, 나는 C#으로 답변 보너스 포인트 있도록 C#에서 일하고 있어요 당신이 임의의 데이터와 데이터를 XOR 때이 작업을 수행 할 수 있도록 결과가 무작위

+1

먼저 MSB 또는 LSB가 먼저 오는지 여부에 관계없이 int에서 비트의 순서를 정의해야합니다. – starblue

+0

네이티브 시스템 주문이 무엇이든간에. 즉, 다른 컴퓨터에서 다를 수 있으며이를 처리 할 수 ​​있어야합니다. – Martin

답변

3

C#에서 임의의 비트-FU 없음 :

BitArray ba = new BitArray (originalIntArray); 
for (int i = startToReplaceFrom; i < endToReplaceTo; i++) 
    ba.Set (i, randomValue); 
+0

아, 비트 배열입니다. 나는 비트 목에 모두 목에 달렸고 명백한 것을 생각하지 않았다. – Martin

1

:이 호출이

for (int i = 0; i < 40; ++i) 
{ 
    x[x.Length - i/32 - 1] ^= random.Next(2) << (i % 32); 
} 

참고 : 루프를 사용할 수있는 N에 대한 일반적인 솔루션을

Random random = new Random(); 
x[x.Length - 2] ^= random.Next(1 << 8); 
x[x.Length - 1] = random.Next(1 << 16); 
x[x.Length - 1] ^= random.Next(1 << 16) << 16; 

필요 이상으로 무작위로 반복되지만 단순합니다. 의사 파이썬

+0

이것은 위에서 설명한 특정 예에 대한 솔루션 일뿐 일반적인 경우는 아닙니다. 게다가, 나는 지난 사건에서 당신이 무엇을하는지 이해하지 못합니다. 왜 마지막 인덱스에 대한 두 가지 무작위성이 있습니까? – Martin

+0

@Martin : 먼저 하위 16 비트를 설정 한 다음 상위 16 비트를 설정합니다. –

+0

아, 왜냐하면 당신이 방금 랜덤에서 32 비트를 사용했기 때문에 msb가 2의 보수로 설정되지 않았을까요? – Martin

0

:

N  = 5 # array size 
bits  = 40 # for instance 
int_bits = 32 # bits in one integer 

i = N 
while bits > 0: 
    value_bits = min (bits, int_bits) 
    bits  -= value_bits 
    mask  = (1 << value_bits) - 1 

    i -= 1 
    array[i] ^= random() & mask 
+0

@Martin : 생각하기에 이것은 기계의 endiness에 달려 있습니다. 마지막 비트가 정확히 무엇을 의미합니까? – doublep

+0

죄송합니다. Big Endian입니다. – Martin

0

int32가 4 바이트 또는 32 비트이다.
그래서 마지막 int 및 8 비트가 필요합니다.

int lastEightBitsMask = 0x000F + 1;
무작위 rand = 새로운 무작위();
arr [arr.Length - 1] = rand.Next();
arr [arr.Length - 2]^= rand.Next (lastEightBitsMask);

설명 :
마지막 요소의 수정 꽤 명확해야 - 당신은 지난 40 개 비트를 필요로하는 경우, 마지막 32 비트가 포함되어 있습니다.
나머지 8 비트의 수정은 rand.Next의 인수가 배타적 인 상한이므로 0x000F + 1로 제한됩니다. 생성 된 randoms은 그 이상이 아닙니다. 숫자의 나머지 비트는 1^0 == 1 및 0^0 == 0이므로 동일하게 유지됩니다.

관련 문제