2016-10-03 4 views
0
다음

내가에 혼란 스러워요 코드의 라인 :이 비트 연산의 목적은 무엇입니까? (mWidth + 0x0000000F) & ~ 0x0000000F;

mMaskRowBytes = (mWidth + 0x0000000F) & ~0x0000000F; 

~ 다 NOT 운영자는 권리?

의이 mWidth 960입니다 가정 해 봅시다

, 또는

1111000000 그래서 단지

00000000000000000000001111000000 

오른쪽에있는을 초래 우리는 여기에서 무엇을 얻을

00000000000000000000001111001111 
& 
11111111111111111111111111110000 

입니까?

10 진수를 2 진수로 변환하는 목적은 무엇입니까?

답변

1

~ 연산자는 보수를 취하여 :

예를 들어 그래서

: 0110의 목적은 잘 모르겠어요 무엇 1001

이 될 것입니다 - 당신이 mMaskRowBytes를 사용하는 방법을 보여해야 할 것입니다. 그러나 16 비트 (2 바이트) 덩어리를 처리하는 것이므로 데이터가 가장 가까운 2 바이트 주소 공간에 정렬되도록해야합니다. 가장 효율적인 스택 정렬을 보장하기 위해 종종 컴파일러가이 작업을 수행합니다. 32 비트 시스템에서 이것은 4 바이트와 64 비트 4/8 바이트가 될 것입니다. 따라서 컴파일러는 효율적인 단계로 스택을 위아래로 이동할 수 있습니다. 최신 OS의 경우 컴파일러와 OS가주의를 기울여야합니다. 당신이 시스템 레벨에 있다면 당신은 스스로 이것을해야 할 수도 있습니다.

+0

여기 이미지로 작업하고 있으므로 OS X에서 메모리를 정렬해야하는 것처럼 보입니까? 아니 100 % –

+0

아, 이건 패딩과 관련이있을 수 있습니다. 당신은 이미지 데이터를 읽고 쓰고 서식을 지정하고 있습니까? 일부 형식은 행 단위로 특정 배수로 패딩 된 것을 필요로합니까? 그렇다면 세부 사항에 너무 매달리지 마십시오. 귀찮은 사람을 구하기 위해 몇 가지 라이브러리가 있어야합니다. – cdcdcd

2

'~'는 비트 보완 문자 연산자입니다.

긍정적 인 경우 mWidth의 경우 모든 숫자는 16의 배수 인 다음 숫자로 반올림됩니다. (960은 이미 16을 나누기 때문에 변경되지 않습니다).

구체적인 사항은 특정 언어에 따라 다르지만 명확한 방법이 있습니다.