2353 / 1771 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
1

Сканирование с младшого до старшего бита на наличие 1

08.01.2013, 21:51. Показов 1801. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Нужна помощь. Есть задание: Задано число А. Мне нужно сделать сканирование с младшого до старшего бита на наличие 1. А тепер проблема - подскажите пжл, как определить конец числа, или подсчитать к-во битов в числе?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2013, 21:51
Ответы с готовыми решениями:

Позиция старшего значащего бита
Нет ли в стандартной библиотеке готовой функции находящей позицию старшего единичного бита числа?...

Обнуление старшего ненулевого бита числа
Добрый день, необходимо обнулить старший ненулевой бит числа, я вроде бы делаю все правильно, но...

Определите четность числа по анализу старшего бита, используя объединение с битовыми полями
Используя объединение с битовыми полями, определите четность беззнакового целого числа по анализу...

Наличие бита в байте
Подскажите, правильна ли реализация проверки наличия бита в байте #define MARK 0x02 .. if...

13
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
09.01.2013, 00:59 2
Почитай про size_of(вроде так пишеться или слитно, давно не пользовался), это размер в битах(или байтах, если байтах, то просто умножить на 8) если не ошибаюсь.
1
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
09.01.2013, 01:20 3
C++
1
2
3
4
5
6
#include <limits>
 
std::numeric_limits<int>::digits
std::numeric_limits<unsigned>::digits
std::numeric_limits<char>::digits
//etc
для знаковых типов знаковый разряд не учитывается
1
2353 / 1771 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
09.01.2013, 01:33  [ТС] 4
Цитата Сообщение от Jupiter Посмотреть сообщение
C++
1
2
3
4
5
6
#include <limits>
 
std::numeric_limits<int>::digits
std::numeric_limits<unsigned>::digits
std::numeric_limits<char>::digits
//etc
для знаковых типов знаковый разряд не учитывается
ничего не понял...
можете об'яснить поподробней?

Добавлено через 1 минуту
Цитата Сообщение от Wolkodav Посмотреть сообщение
Почитай про size_of(вроде так пишеться или слитно, давно не пользовался), это размер в битах(или байтах, если байтах, то просто умножить на 8) если не ошибаюсь.
я вкурсе о этой ф-ии, она возвращает к-во байт. Попробую сделать, но не знаю ли получится то что надо.
0
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,420
09.01.2013, 01:44 5
Цитата Сообщение от zewer Посмотреть сообщение
Задано число А. Мне нужно сделать сканирование с младшого до старшего бита на наличие 1
нашли а дальше что?
C++
1
2
3
4
5
6
7
8
while(n)// крутим пока число не равно 0
{
if(n%2)
// что то делаем если бит равен 1 
else
// что то делаем если бит равен 0
n/=2;// готовим следующий бит
}
Добавлено через 5 минут
ищем первую единицу и отваливаем
C++
1
2
3
4
5
6
7
8
9
10
11
12
int i=-1;
while(n)// крутим пока число не равно 0
{
i++; 
if(n%2)
  break;
n/=2;
}
if(i<0)
  printf("Нет едениц");
else
 printf("Единица в %d разряде",i);
1
2353 / 1771 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
09.01.2013, 01:50  [ТС] 6
полное задание:
1.1 Побитовое сканирование в прямом (от младших к старшим) направлении regA в поисках бита с 1, возвращает номер позиции в destReg. Если 1 найдено ZF = 1, иначе ZF = 0
1.2 Побитовое сканирование в обратном направлении (от старших к младшим) regA в поисках бита с 1, возвращает номер позиции в destReg. Если 1 найдено ZF = 1, иначе ZF = 0

Это я делаю регистр признаки 0 - zero flax. Проблема в том, что надо вертеть число слева направо и справа налево...
П.С. нужно было сразу давать полное задание, чтото протупил...
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
09.01.2013, 01:59 7
Так все же элементарно
sizeof - и ты знаешь, сколько бит в числе
циклом пробегаешься по всем, с помощью побитового сдвига и битового "и"

C++
1
2
3
4
5
6
7
int number = 256, bit = 1;
    for(unsigned int i = 1; i <= sizeof(number) * 8; ++i)
    {
        cout << (number & bit);
        if(i % 8 == 0) cout << " ";
        number >>= 1;
    }
1
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,420
09.01.2013, 01:59 8
Цитата Сообщение от zewer Посмотреть сообщение
1.1 Побитовое сканирование в прямом (от младших к старшим) направлении regA в поисках бита с 1, возвращает номер позиции в destReg. Если 1 найдено ZF = 1, иначе ZF = 0
Это я тебе сделал
Цитата Сообщение от zewer Посмотреть сообщение
Побитовое сканирование в обратном направлении (от старших к младшим) regA в поисках бита с 1, возвращает номер позиции в destReg. Если 1 найдено ZF = 1, иначе ZF = 0
C++
1
2
3
4
5
6
7
8
9
for(int i=sizeof(int)*8; i<=0; i--)
{
 if(n&(1<<i))
  break;
}
if(i<0)
  printf("Нет едениц");
else
 printf("Единица в %d разряде",i);
флаги я думаю сам раставишь
1
2353 / 1771 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
09.01.2013, 02:04  [ТС] 9
спасибо, все понял, потом посмотрим что на практике будет...
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
09.01.2013, 18:24 10
ValeryS, кхм. Что, говорите, вы курите?

C++
1
for(int i=sizeof(int)*8; i<=0; i--)
0
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,420
09.01.2013, 19:23 11
Цитата Сообщение от Kgfq Посмотреть сообщение
ValeryS, кхм. Что, говорите, вы курите?
ну и описался немного (время поста то посмотри) идея то не потерялась
там кстати и i нельзя в цикле объявлять
вот рабочий цикл
C++
1
2
3
4
5
6
7
8
9
10
int i;
 for(i=sizeof(int)*8; i>=0; i--)
  {
    if(n&(1<<i))
     break;
   }
if(i<0)
  printf("Нет едениц");
else
 printf("Единица в %d разряде",i);
0
Неэпический
17850 / 10618 / 2049
Регистрация: 27.09.2012
Сообщений: 26,689
Записей в блоге: 1
09.01.2013, 19:27 12
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
i=sizeof(int)*8
а сдвиг на кол-во бит имеет смысл? Может:
C++
1
i=sizeof(int)*8-1
Или я что-то путаю?
1
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,420
09.01.2013, 19:38 13
Croessmah,
ты прав, просто не проверял сейчас проверил да сдвиг на 32 бита не есть гут( у меня по крайней мере идет заворот)
1<<32 =1 циклический сдвиг однако хотя по моему поведение не определено
вот так правильно

C++
1
2
3
4
5
6
7
8
9
10
int i;
 for(i=sizeof(int)*8-1; i>=0; i--)
  {
      if(n&(1<<i))
     break;
   }
if(i<0)
  printf("Нет едениц");
else
 printf("Единица в %d разряде",i);
0
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,420
09.01.2013, 19:46 14
Kgfq, у тебя тоже не все слава богу
число то задом наперед выводится
0
09.01.2013, 19:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2013, 19:46
Помогаю со студенческими работами здесь

Как проверить наличие бита в байте
Здравствуйте!! Собственно вопрос, можно ли как нибудь записать условие if на проверку бита в...

Функция, которая для заданного числа рассчитывает позицию первого слева (старшего) нулевого бита числа
Написать функцию, которая для заданного числа х рассчитывает позицию первого слева (старшего)...

В двоичном представлении инвертировать все одиночные единицы, кроме старшего бита
В двоичном представлении инвертировать все одиночные единицы, кроме старшего бита.

В двоичном представлении инвертировать все одиночные единицы, кроме старшего бита
В двоичном представлении инвертировать все одиночные единицы ,кроме старшего бита.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru