2014-04-23 7 views
3

BitArray에서 비트를 변경할 때 BitArray 값이 범위 내에 유지되도록하려면 어떻게해야합니까?BitArray가 범위 내의 비트를 변경합니다.

예 : 범위 주어

[-5.12, 5.12] 및

A = 0100000000000000011000100100110111010010111100011010100111111100 (= 2.048)이 임의의 위치에 비트를 변경하여

, 나는 새로운 가치가 주어진 범위에 남아 있도록해야한다.

+0

* 부동 소수점 숫자를 사용해야합니까? 대신에 고정 소수점 형식을 사용하여 값을 간단한 int로 변환 할 수 있습니까? 그렇게하면 쉽게 처리 할 수 ​​있습니다. –

+1

현재'a '를 어떻게 저장하고 있습니까? – Anthony

답변

1

나는 당신이하고있는 일을 100 % 확신하지 못하고 있으며이 대답은 현재 a을 64 비트 값 (long)으로 저장한다고 가정합니다. 다음 코드는 올바른 방향으로 당신을 가리킬 수 있습니다.

const double minValue = -5.12; 
const double maxValue = 5.12; 

var initialValue = Convert.ToInt64("100000000000000011000100100110111010010111100011010100111111100", 2); 
var changedValue = ChangeRandomBit(initialValue); // However you're doing this 

var changedValueAsDouble = BitConverter.Int64BitsToDouble(initialValue); 
if ((changedValueAsDouble < minValue) || (changedValueAsDouble > maxValue)) 
{ 
    // Do something 
} 
0

double (64 비트 및 결과에는 소수점이 있음)입니다.

당신은 비트, 지수 및 일부 서명이, 그래서 당신은 임의 비트를 변경하고 여전히 몇 가지 예외를 제외하고, 범위의 값을 가질 수 없습니다다시피 :

  • 부호 비트가없이 변경 될 수 있습니다 범위가 [-x; + x] (같은 x) 인 경우 문제가 발생합니다. 01에서 분수 비트의 지수를 변경해 |a| 적은 것
  • :
  • 변화 지수 또는 분획 새로운 값 범위를 확인해야하는 것이지만.

나는 당신이 달성하고자하는 것을 알고 있습니까? 아마도 무언가를 검증하거나 수정하려고 시도하고 있다면 this을 살펴보십시오.

+0

내 생각 엔 유전자 알고리즘이 될거야. –

0

float의 새로운 값이 지정된 범위 밖에있는 경우 설정된 비트를 실행 취소하는 확장 메서드입니다 (이 예제는 하나의 예일 뿐이지 만 체크가없는 float을 사용하는 BitArray에 의존하므로 매우 끔찍합니다). 포함) 두배로 변경이 밖으로 솔루션을 해킹 :

static class Extension 
{ 
    public static void SetFloat(this BitArray array, int index, bool value, float min, float max) 
    { 
     bool old = array.Get(index); 
     array.Set(index, value); 
     byte[] bytes = new byte[4]; 
     array.CopyTo(bytes, 0); 
     float f = BitConverter.ToSingle(bytes, 0); 
     if (f < min || f > max) 
      array.Set(index, old); 
    } 
} 

사용 예 : 당신은 실제로 당신의 정밀도를 제한 할 수있는 경우

static void Main(string[] args) 
{ 
    float f = 2.1f; 
    byte[] bytes = System.BitConverter.GetBytes(f); 
    BitArray array = new BitArray(bytes); 
    array.Set(20, true, -5.12f, 5.12f); 
} 
0

가, 다음이 훨씬 쉬울 것입니다. 예를 들어 범위 제공 :

1000000000 

을 이제 당신에게 : 나는 5.12 100을 곱하면

[-5.12, 5.12] 

를, I는 물론

[-512, 512] 

그리고 정수 512 바이너리를 얻을 수 처음 9 비트 중 하나를 설정할 수 있다는 것을 알고 있고, 10 번째 비트가 0이면 < 512이됩니다. 10 번째 비트를 설정하면 다른 모든 비트를 0으로 설정해야합니다.약간의 노력을 기울여서 2의 보수 값도 처리 할 수 ​​있습니다 (단, 양수 값으로 변환 할 수도 있습니다).

이제 3d.p. 2.048의 다음 (대신 1000 모든 당신 값을 곱해야 이진의 5120 당신은 최상위 비트를 제외하고는 모든 것을 원하는 무엇이든 할 수있어 1010000000000

이기 때문에 좀 더 어려울 것입니다 MSB).이 경우, MSB가 1이지만 다음 2 비트가 0이면 나머지 비트와 함께 원하는 모든 작업을 수행 할 수 있습니다.

IEEE-754 부동 소수점 형식의 숫자를 직접 처리하는 데 관련된 논리는 아마도 고문이 될 것입니다.

또는 "값을 변경 한 다음 테스트 해보십시오"접근 방식이 범위를 벗어난 경우 되돌아 가서 다시 시도하십시오. 어느 것이 적합 할 수 있지만 (실제로), 빠져 나가는 것은 보장되지 않습니다.

정확히 무엇을하고 있는지에 따라 Gray Codes을보고 싶을 수도 있습니다. 그레이 코드의 개념은 각 값이 단지 1 비트 뒤집혀 있도록하는 것입니다. 자연적으로 인코딩 된 바이너리의 경우 MSB의 플립은 LSB의 플립보다 최종 값에 더 많은 영향을 미칩니다.