2009-12-22 6 views
0

가능한 중복 :
Have you ever had to use bit shifting in real projects?
When to use Shift operators << >> in C# ?비트 시프트/단항 연산자 등은 언제 사용해야합니까?

내가 오래 전에이 배운해야하지만, bitshifts/단항 연산자 등 유용 어떤 코딩 작업/시나리오?

내가 코딩 (대부분 LOB 앱)에서 이들에 대한 필요성을 알지 못했기 때문에 어떤 개념의 작업/문제로 인해 이러한 개념을 사용해야합니까?

감사

+0

중복 : http://stackoverflow.com/questions/520625/have-you-ever-had-to-use-bit-shifting-in -real-projects –

+0

중복 : http://stackoverflow.com/questions/1933597 – dtb

답변

2

이 당신이 그들을 사용하는 그냥 "필요"를하지 않는, 그런 식으로 작동하지 않습니다. 비트 시프트 연산을 사용하는 경우 보다 빠르게 주어진 작업을으로 만드는 것이 더 필요합니다.

일반적으로 필요한 항목은 거의 없지만 많은 수학 기능에서 성능을 발휘하고 해시 함수 및 기타 암호화 연산을 향상시키는 데 유용합니다 (사실 수학 기반입니다).). 기본적으로 대부분의 경우 주어진 알고리즘의 성능을 향상시킵니다.

0

C#으로 살면 일상적으로 사용하지 않는 것이 아닙니다. 바이트 순서 변환 (리틀 엔디안/빅 엔디안)을 다루는 하위 바이트 단위 (구조체 마샬링 등)가있는 비 관리 코드와 상호 운용 할 때 주로 사용됩니다. FlagsAttribute를 사용하는 열거 형은 이미이를 수행합니다.

비 관리 용품의 대부분은 매우 효율적인 저장을 위해 비트 필드를 사용합니다. Bitfields는 C#에서 고질적 인 고통이 될 수 있습니다. 일부 관리 된 사용자 모드 드라이버 프레임 워크 코딩을 수행하고 일부는 C#의 원시 TIFF 파일 형식으로 작업하고 빨려 들었습니다. C/C++는 그 (것)들을 취급하기를위한 더 나은 기능이 있습니다.

1

UTF-8 및 기타 멀티 바이트 문자 인코딩과 같은 일종의 비트 수준 인코딩이 관련된 모든 것. 이 경우 개별 비트를 검사하고 비트 문자열을 결합해야합니다.

가장 간단한 경우는 다양한 플래그를 단일 바이트에 저장하려는 경우입니다. 그럼 당신은 단일 바이트로 함께 이러한 결합 할 수 있습니다

const uint FOO_DELETED = 0x01; 
const uint FOO_DRAFT = 0x02; 
const uint FOO_WHATEVER = 0x04; 
// ... 

:

byte my_flags = FOO_DELETED | FOO_WHATEVER; 

그리고 압축을 풉니 : 또 다른 예를 곱하거나 나눌 수있다

bool is_deleted = (my_flags & FOO_DELETED); 
0

을 당신이 뭔가를 정의 할 수 있습니다 2에 의해

int a = 10; 
int result = 0; 

result = a << 1; // result is 10 * 2 == 20; 
result = a >> 1; // result is 10/2 == 5; 

이러한 작업은 일반적으로 "실제"연산자보다 빠릅니다. * 또는/

+0

"일반적으로 훨씬 빠릅니다"- 사용해 보셨습니까? – AakashM

+0

여기에 차이가 없습니다 : '반복 : 1,000,000,000 x << 1 : 4970ms x * 2 : 4957ms' 저는 런타임이 이미이를 최적화한다고 생각합니다. 아니면 심지어 CPU 레벨에서, 나는 잘 모르겠다. – Botz3000

+0

보통 Botz3000 같은 컴파일러가 이러한 종류의 작업을 최적화 할 수 있기 때문입니다. 하지만 예, 저는 이것을 임베디드 시스템 프로그래밍에서 여러 번 사용해 왔습니다. –

관련 문제