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

IF AT("01",m.lcBitString)=0
RETURN .T.
ELSE
RETURN .F.
ENDIF
...
Рейтинг: 0 / 0
Как определить, что в двоичном представлении числа 0 только в младших разрядах
    #32451577
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде того
Код: 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
Как определить, что в двоичном представлении числа 0 только в младших разрядах
    #32451735
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
* 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
Как определить, что в двоичном представлении числа 0 только в младших разрядах
    #32451782
Дмитрий Валуев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
Двоичное представление числа оказалось не так-то просто (для меня)получить. Функция 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
Как определить, что в двоичном представлении числа 0 только в младших разрядах
    #32451903
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если разрядность нужна всегда 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
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как определить, что в двоичном представлении числа 0 только в младших разрядах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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