Побитовые операции
От: Аноним  
Дата: 08.01.10 11:52
Оценка:
Добрый день.

Есть адрес:

DWORD addr = 0x54410000;

Нужно из этого числа вытащить 544 для того чтобы в дальнейшем использовать его как маску:


ULONG_PTR addrPointer = 0x0003b400;
DWORD mask = 0x54400000;
while (true)
{
addrPointer = addrPointer + 0x00000001;
if(addrPointer & mask)
//Do smth
}
Re: Побитовые операции
От: игппук Беларусь  
Дата: 08.01.10 12:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.


А>Есть адрес:


А>DWORD addr = 0x54410000;


А>Нужно из этого числа вытащить 544 для того чтобы в дальнейшем использовать его как маску:


логическое AND по 0xF вытаскивает маску

DWORD addr = 0x54410000;
DWORD mask = addr & 0xFFF00000;

далее mask нужно сдвинуть на два байта вправо
mask >> 16

в итоге получаем саму маску
проклятый антисутенерский закон
Re[2]: Побитовые операции
От: igna Россия  
Дата: 08.01.10 12:30
Оценка:
Здравствуйте, игппук, Вы писали:

И>далее mask нужно сдвинуть на два байта вправо

И>mask >> 16

Зачем сдвигать вправо? Чтобы потом каждый раз в цикле сдвигать влево?
Re[3]: Побитовые операции
От: игппук Беларусь  
Дата: 08.01.10 13:25
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, игппук, Вы писали:


И>>далее mask нужно сдвинуть на два байта вправо

И>>mask >> 16

I>Зачем сдвигать вправо? Чтобы потом каждый раз в цикле сдвигать влево?


а, ну возможно и не надо. я просто подумал, что человеку нужна маска типа 0x00000XXX, а не типа 0xXXX00000.
проклятый антисутенерский закон
Re[4]: Побитовые операции
От: igna Россия  
Дата: 08.01.10 14:25
Оценка: 1 (1)
Здравствуйте, игппук, Вы писали:

И>а, ну возможно и не надо. я просто подумал, что человеку нужна маска типа 0x00000XXX


Тогда во-первых сдвигать нужно на 20, а не на 16, во-вторых нужно замаскировать старшие разряды, могущие появиться в результате знакового сдвига:

(addr >> 20) & 0xFFF


А первоначальное твое действие:

addr & 0xFFF00000


вовсе не нужно. Зачем маскировать биты, которые все-равно будут выдвинуты за пределы разрядной сетки?
Re[5]: Побитовые операции
От: игппук Беларусь  
Дата: 08.01.10 15:36
Оценка:
Здравствуйте, igna, Вы писали:

I>
I>(addr >> 20) & 0xFFF
I>


согласен.
проклятый антисутенерский закон
Re: Побитовые операции
От: dimchick Украина  
Дата: 09.01.10 16:41
Оценка:
Здравствуйте, Аноним, Вы писали:

Это вопроса не касается, но лучше использовать DWORD_PTR вместо DWORD для работы с адресами. Иначе при преходе на 64бит платформу можете потерять данные.

А>Добрый день.


А>Есть адрес:


А>DWORD addr = 0x54410000;


А>Нужно из этого числа вытащить 544 для того чтобы в дальнейшем использовать его как маску:



А>ULONG_PTR addrPointer = 0x0003b400;

А>DWORD mask = 0x54400000;
А>while (true)
А>{
А> addrPointer = addrPointer + 0x00000001;
А> if(addrPointer & mask)
А> //Do smth
А>}
Re[5]: Побитовые операции
От: Олег К.  
Дата: 10.01.10 05:13
Оценка: 5 (1) +1
I>Тогда во-первых сдвигать нужно на 20, а не на 16, во-вторых нужно замаскировать старшие разряды, могущие появиться в результате знакового сдвига:

I>
I>(addr >> 20) & 0xFFF
I>

На счет второго & 0xFFF не согласен в данном случае, хотя не повредит. addr — DWORD который является unsigned long. Поэтому старшие биты всегда будут нулем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.