문제

비트 마스크를 사용하여 하나의 변수에 여러 값을 저장하는 일반적인 방법이 있습니다. 예를 들어, 사용자가 항목의 권한을 읽고 쓰고 쓰고 실행 한 경우 read = 4 (2^2), write = 2 (2^1), execute = 1 (2^0) 그런 다음 함께 추가하여 7을 얻습니다.

나는이 기술을 여러 웹 애플리케이션에서 사용하는데, 여기서 보통 변수를 필드에 저장하고 다른 값의 수에 따라 유형의 중간 인 또는 그 밖의 유형을 제공합니다.

내가 관심있는 것은 이렇게 저장할 수있는 값 수에 실질적인 한계가 있는지 여부입니까? 예를 들어, 숫자가 64 세 이상인 경우 더 이상 (64 비트) 정수를 사용할 수 없습니다. 이것이 사실이라면, 당신은 무엇을 사용 하시겠습니까? 프로그램 논리에 어떤 영향을 미치는지 (즉, 여전히 비트 비교를 사용할 수 있습니까?)

일단 당신이 정말로 큰 값 세트를 얻기 시작하면 다른 방법이 최적의 솔루션이 될 것이지만, 나는 경계에 관심이 있습니다. 이것 방법.

도움이 되었습니까?

해결책

내 머리 꼭대기에서 나는 set_bit 그리고 get_bit 배열에서 바이트 배열과 비트 오프셋을 가져갈 수있는 함수를 사용하고 비트 widdling을 사용하여 배열에서 적절한 비트를 설정/얻을 수 있습니다. 이와 같은 것 (C에서는 아이디어를 얻을 수 있기를 바랍니다) :

// sets the n-th bit in |bytes|. num_bytes is the number of bytes in the array
// result is 0 on success, non-zero on failure (offset out-of-bounds)
int set_bit(char* bytes, unsigned long num_bytes, unsigned long offset)
{
  // make sure offset is valid
  if(offset < 0 || offset > (num_bytes<<3)-1) { return -1; }

  //set the right bit
  bytes[offset >> 3] |= (1 << (offset & 0x7));

  return 0; //success 
}

//gets the n-th bit in |bytes|. num_bytes is the number of bytes in the array
// returns (-1) on error, 0 if bit is "off", positive number if "on"
int get_bit(char* bytes, unsigned long num_bytes, unsigned long offset)
{
  // make sure offset is valid
  if(offset < 0 || offset > (num_bytes<<3)-1) { return -1; }

  //get the right bit
  return (bytes[offset >> 3] & (1 << (offset & 0x7));
}

다른 팁

파일 시스템 코드에서 비트 마스크를 사용하여 비트 마스크가 기계 단어보다 여러 배 더 큽니다. "부울의 배열"처럼 생각하십시오.

(알고 싶다면 플래시 메모리의 저널링 마스크)

많은 컴파일러 가이 작업을 수행하는 방법을 알고 있습니다 당신을 위한. Adda 비트 OO 코드는 Sensely로 작동하는 유형을 갖기위한 OO 코드를 사용하여 코드가 비트 널리가 아니라 의도처럼 보이기 시작합니다.

내 2 센트.

64 비트 정수를 사용하면 최대 2^64-1의 값을 저장할 수 있으며 64는 2^6입니다. 그렇습니다. 한계가 있지만 64 인치 이상의 깃발이 필요하다면 그들이 무엇을하고 있는지 알고 싶습니다. :)

잠재적으로 생각해야 할 주가 몇 개입니까? 64 개의 잠재적 상태가있는 경우, 존재할 수있는 조합 수는 64 비트 정수의 전체 크기입니다.

128 개의 깃발에 대해 걱정해야한다면 한 쌍의 비트 벡터로 충분합니다 (2^64 * 2).

덧셈: 프로그래밍 진주에는 정수로 구현 된 비트 길이 10^7의 비트 배열 사용에 대한 확장 된 토론이 있습니다 (중고 800 숫자를 보유하기 위해) -이 장에서 설명한 작업에 매우 빠르며 매우 적합합니다.

일부 언어 (Perl이 확실하지 않다고 생각합니다)는 문자열에 약간의 산술을 허용합니다. 훨씬 더 효과적인 범위를 제공합니다. ((strlen * 8bit chars) 조합)

그러나 둘 이상의 / 유형 / 유형의 데이터를 중첩하기 위해 단일 값을 사용하지 않습니다. 3 비트 INT의 기본 R/W/X 트리플렛은 아마도 우주 효율성 이유가 아니라 실제 개발 이유로 상위 "실제"한계 일 것입니다.

(PHP는이 시스템을 사용하여 오류 메시지를 제어하며, PHP의 상수가 거주하지 않고 손으로 정수를 생성 해야하는 값을 정의해야 할 때 약간의 최고 임금을 이미 발견했습니다. 솔직히 말해서, chmod가 'ugo+rwx'스타일 구문을 지원하지 않았다면 나는 마법의 숫자를 결코 기억할 수 없기 때문에 그것을 사용하고 싶지 않을 것입니다)

당신이 너무 멀리 갔다는 것을 알고있는 코드를 디버그 코드로 상수 테이블을 열어야하는 순간.

오래된 스레드이지만, 모자 분자 지문 (예 : 분자 지문이 필요한 경우가 종종 32 개의 Bigint 필드)에 포장 한 1024 비트 배열 (UINT32를 지원하지 않는 SQL Server)이 필요한 경우를 언급 할 가치가 있습니다. 비트 현명한 운영은 잘 작동합니다. 테이블이 커지기 시작하고 별도의 기능 호출의 부진을 깨닫게됩니다. 이진 데이터 유형은 2 개의 바이너리 피연산자가있는 Bitwise 연산자에 대한 T-SQL의 금지가 아닌 이진 데이터 유형이 작동합니다.

예를 들어 .NET은 정수 배열을 BitArray 클래스의 내부 스토리지로 사용합니다. 실제로 다른 방법은 없습니다.

즉, SQL에서는 모든 상태를 저장하려면 둘 이상의 열 (또는 blobs)이 필요합니다.

이 질문 SQL에 태그를 지정 했으므로 정수의 크기를 찾으려면 데이터베이스의 문서와 상담해야한다고 생각합니다. 그런 다음 기호를 위해 비트를 빼고 안전합니다.

편집하다: 귀하의 의견에 따르면 MySQL을 사용하고 있다고합니다. 문서 MySQL 5.0 숫자 유형 숫자의 최대 크기는 64 또는 65 자리라고 말합니다. 64 자리에 212 비트입니다.

당신의 선택 언어는 그 숫자와 함께 일할 수 있어야하므로 어쨌든 64 비트 정수로 제한 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top