2013-02-24 7 views
-1

C, Ruby 또는 PHP에서 비트 배열의 모든 비트 세트의 오프셋을 어떻게 얻을 수 있습니까? 예컨대 :비트 배열의 모든 비트 세트의 오프셋을 어떻게 얻을 수 있습니까?

Bitarray: 1 0 0 1 0 
Offset: 5 4 3 2 1 
Yields 2 and 5. 

10001 => {1,5} 
11 => {1,2} 
1001001 => {1,4,7} 

가장 확실한 해결책은 먼저 반대가 처음 오프셋/인덱스를 저장하는 비트를 통해 길이와 다음 루프를 알고 설정 찾기 할 것입니다. 그러나 이것은 매우 똑똑해 보이지 않습니다. 빼기가있는 FFSR과 같은 것이 더 좋을 수도 있습니다.

+0

어떤 언어 사용하고 무엇을 당신이 지금까지 시도? –

+0

언어는 C 또는 Ruby/PHP가 될 수 있습니다. – Gustav

+0

그래서, C에서, 당신의 bitarray 표현은 무엇입니까? –

답변

0

나는 이것을 생각해 냈습니다. 바이너리 시프트 연산을 사용하여 바이너리 "1"또는 "0"이 있는지 알아 냈습니다. 아마도이 코드를 출발점으로 사용할 수 있습니다.

#include <stdio.h> 

int main() 
{ 
    int number; 
    int counter = 1; 

    printf("Please input the number to get the offsets: "); 
    scanf("%d", &number); 

    printf("The required positions of ones: "); 
    while ((number != 0)) 
    { 
     if ((number % 2) != 0) 
     { 
      number = number >> 1; 
      printf("%d", counter); 
     } 
     else 
     { 
      number = number >> 1; 
     } 

     counter++; 
    } 

    return 0; 
} 

여기뿐만 아니라 바이너리 표현을 출력 확장 버전은 다음과 같습니다

#include <stdio.h> 
#include <strings.h> 

char* rev(char* str); 

int main() 
{ 
    int number, temp; 
    int counter = 1; 
    char str[32] = ""; 

    printf("Please input the number to get the offsets: "); 
    scanf("%d", &number); 
    temp = number; 

    printf("Binary representation: "); 
    while ((temp != 0)) 
    { 
     if ((temp % 2) != 0) 
     { 
      temp = temp >> 1; 
      strncat(str, "1", 1); 
     } 
     else 
     { 
      temp = temp >> 1; 
      strncat(str, "0", 1); 
     }  
    } 
    printf("%s", rev(str)); 

    printf("\nThe required positions of ones: "); 
    while ((number != 0)) 
    { 
     if ((number % 2) != 0) 
     { 
      number = number >> 1; 
      printf("%d", counter); 
     } 
     else 
     { 
      number = number >> 1; 
     } 

     counter++; 
    } 

    getch(); 
    getch(); 
    return 0; 
}  

char* rev(char* str) 
{ 
    int end= strlen(str) - 1; 
    int start = 0; 

    while(start<end) 
    { 
    str[start] ^= str[end]; 
    str[end] ^= str[start]; 
    str[start]^= str[end]; 

    ++start; 
    --end; 
    } 

    return str; 
} 
+0

이동 부분은 정말 영리합니다. – Gustav

+0

그게 당신이 요구 하는게 아닌가요? –