Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как определить, что в двоичном представлении числа 0 только в младших разрядах / 8 сообщений из 8, страница 1 из 1
22.03.2004, 12:34
    #32451209
Дмитрий Валуев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в двоичном представлении числа 0 только в младших разрядах
Добрый день.
Подскажите, пожалуйста, кто хорошо владеет побитовыми операциями.
Требуется написать функцию, которая бы возвращала .Т., если в двоичном представлении числа нули содержаться только в младших разрядах, в противном случае .F.
Например:
1111110000 .Т.
1111110001 .F.
1011111111 .F.
1000000000 .T.
Можно написать "в лоб" с помощью BITTEST(), но нет ли способа попроще?
Спасибо
...
Рейтинг: 0 / 0
22.03.2004, 12:50
    #32451245
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в двоичном представлении числа 0 только в младших разрядах
func isbit
lpara lnNumber
return mod(lnNumber,2)=0
...
Рейтинг: 0 / 0
22.03.2004, 13:13
    #32451310
Дмитрий Валуев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в двоичном представлении числа 0 только в младших разрядах
Crip
Сорри, мои примеры были неполные, проверки на четность недостаточно.
110011001 .F. и
110011000 .F. тоже
Нули должны занимать только младшие разряды, после появления первой 1 в старших разрядах могут быть только 1.
...
Рейтинг: 0 / 0
22.03.2004, 13:37
    #32451380
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в двоичном представлении числа 0 только в младших разрядах
Если двоичное представление числа уже сформировано, то можно в полученной строке поискать строку "01". Если найдено, то возвращаем .F.

IF AT("01",m.lcBitString)=0
RETURN .T.
ELSE
RETURN .F.
ENDIF
...
Рейтинг: 0 / 0
22.03.2004, 15:24
    #32451577
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в двоичном представлении числа 0 только в младших разрядах
вроде того
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
FUNCTION  isbit 
LPARAMETERS  lnNumber 
IF lnNumber =  0  
	RETURN .T.
ENDIF 

IF BITTEST(lnNumber, 0 )
	RETURN .F.
ENDIF 

lnNumber = BITRSHIFT(lnNumber, 1 )
DO WHILE !BITTEST(lnNumber, 0 )
	lnNumber = BITRSHIFT(lnNumber, 1 )
ENDDO  

DO WHILE BITTEST(lnNumber, 0 )
	lnNumber = BITRSHIFT(lnNumber, 1 )
ENDDO  

RETURN lnNumber =  0  
...
Рейтинг: 0 / 0
22.03.2004, 16:44
    #32451735
XAndy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в двоичном представлении числа 0 только в младших разрядах
* iNum - целое число
* iWidth - фактическая разрядность числа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
lparameters iNum, iWidth
local lPulse, lBit, lRes

lRes = .t.
for i= 0  to iWidth- 1 
   lPulse = lBit<>bittest(iNum,i)
   lBit = bittest(iNum,i)         && .t. ==  1 
   if lPulse and !lBit
      lRes = .f.
      exit
   endif
endfor

return lRes


Осталось только определиться с граничными условиями, я принял. что при 0 (все нули) и -1 (все единицы) возвращяется истина.
...
Рейтинг: 0 / 0
22.03.2004, 17:20
    #32451782
Дмитрий Валуев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в двоичном представлении числа 0 только в младших разрядах
ВладимирМ
Двоичное представление числа оказалось не так-то просто (для меня)получить. Функция BINTOC дает 4-х байтовое представление, в котором подстроку "01" еще не поищешь. И, кроме того, BINTOC работает до 2,147,483,647 (естественно, раз 4 байта), а мне надо до 4,294,967,295 (десятичное представление максимального IP-адреса).
Crip
К счастью, функции BITTEST и BITRSHIFT работают в нужном диапазоне. Проверил на нескольких небольших числах ваш алгоритм - работает. Есть только 2 момента
1.В случае если в двоичном представлении все 1, то тоже .T.
Поэтому
Код: plaintext
1.
2.
IF BITTEST(lnNumber, 0 )
	RETURN .F.
ENDIF 

заменил на
Код: plaintext
1.
2.
IF lnNumber= 4294967295 
	RETURN .T.
ENDIF 

2.Алгоритм зацикливался при lnNumber=1

Окончательный вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
FUNCTION checkMask
LPARAMETERS  lnNumber 
IF lnNumber =  0  
	RETURN .T.
ENDIF 
IF lnNumber= 4294967295 
	RETURN .T.
ENDIF 
lnNumber = BITRSHIFT(lnNumber, 1 )
IF lnNumber =  0  
	RETURN .F.
ENDIF
DO WHILE !BITTEST(lnNumber, 0 )
	lnNumber = BITRSHIFT(lnNumber, 1 )
ENDDO  
DO WHILE BITTEST(lnNumber, 0 )
	lnNumber = BITRSHIFT(lnNumber, 1 )
ENDDO  
RETURN lnNumber =  0  

xAndy
А как получить фактическую разрядность числа? Если кроме как функцией BINTOC нельзя, то она не устраивает меня по диапазону значений. Извиняюсь, что сразу не оговорил диапазон.

Всем спасибо. Вариант от Crip вполне устроил.
...
Рейтинг: 0 / 0
22.03.2004, 18:32
    #32451903
XAndy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в двоичном представлении числа 0 только в младших разрядах
Если разрядность нужна всегда 32 бита, то вот простой вариант, работает в диапазоне unsigned long int - от 0 до FFFFFFFFh (4294967295)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
lparameters iNum
local lPulse, lBit, lRes

lRes = .t.
for i= 0  to  31 
   lPulse = lBit<>bittest(iNum,i)
   lBit = bittest(iNum,i)
   if lPulse and !lBit
      lRes = .f.
      exit
   endif
endfor

return lRes
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как определить, что в двоичном представлении числа 0 только в младших разрядах / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]