크기 2^x의 특정 "블록"을 새 값으로 바꾸는 함수를 작성하려고합니다.비트 조작 - "블록"바꾸기
예를 들어 숫자가 1110 1000 0010
이고 블록 2 (최대 블록 크기가 2^4)를 0110
으로 바꾸려면 0110 1000 0010
이 표시됩니다. 마찬가지로 블록 2를 110
(최대 블록 크기 2^3)으로 바꾸려면 111 110 000 010
또는 1111 1000 0010
이 표시됩니다.
replace_block (value, x, blockNumber, newValue) {
value |= ((value >> (blockNumber*x) & ~((1 << x) – 1)) | newValue) << (blockNumber*x)
}
Step by step process of what I'm trying to do with this code:
1. Shift the block we want all the way to the right
2. Mask that block with 0's
3. Mask that block again, but with the new value we want
4. Shift the block all the way back to the original position
5. Or the bits in the block with the original value
이것은 내가 지금까지 가지고있는 것이지만 그것이 정확하다고 생각하지 않습니다.
참고 : 마스크는 넓은 우측 블록으로 이동 것 "블록 크기"의 집합입니다 : 가장 오른쪽 블록은 우리가 마스크를 필요 0
1,000 0,010 1,110 들면 : 블록 수는 2^4의 블록 크기를 갖는 우측 0부터 시작하면 (16 비트)이면 블록 2는 0110으로 대체되는 XXXX 1000 0010이고 2^3 (8) 블록 크기의 경우 블록 2는 111 XXX 000 010이어야하지만 예에서 블록 1을 대체해야합니다. 111 010 010 010 그래서 110 번 블록을 오른쪽 블록 0으로 계산합니까? –
예, 오른쪽의 블록 0부터 시작합니다. 내 게시물을 수정했습니다. 죄송합니다. – dtgee