Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
zewer
1671 / 1286 / 160
Регистрация: 07.01.2011
Сообщений: 8,059
Завершенные тесты: 1
1

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

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

Привет всем. Нужна помощь. Есть задание: Задано число А. Мне нужно сделать сканирование с младшого до старшего бита на наличие 1. А тепер проблема - подскажите пжл, как определить конец числа, или подсчитать к-во битов в числе?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2013, 21:51
Ответы с готовыми решениями:

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

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

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

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

Создать 2 переменные, одна из которых хранит 2 старших бита исходного числа, другая 2 младших бита этого числа
Дано число. Создать 2 переменные, одна из которых хранит 2 старших бита...

13
Wolkodav
609 / 462 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
09.01.2013, 00:59 2
Почитай про size_of(вроде так пишеться или слитно, давно не пользовался), это размер в битах(или байтах, если байтах, то просто умножить на 8) если не ошибаюсь.
1
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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
zewer
1671 / 1286 / 160
Регистрация: 07.01.2011
Сообщений: 8,059
Завершенные тесты: 1
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
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,672
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
zewer
1671 / 1286 / 160
Регистрация: 07.01.2011
Сообщений: 8,059
Завершенные тесты: 1
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
Kgfq
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
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,672
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
zewer
1671 / 1286 / 160
Регистрация: 07.01.2011
Сообщений: 8,059
Завершенные тесты: 1
09.01.2013, 02:04  [ТС] 9
спасибо, все понял, потом посмотрим что на практике будет...
0
Kgfq
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
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,672
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
Croessmah
++Ͻ
14607 / 8361 / 1576
Регистрация: 27.09.2012
Сообщений: 20,553
Записей в блоге: 2
Завершенные тесты: 1
09.01.2013, 19:27 12
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
i=sizeof(int)*8
а сдвиг на кол-во бит имеет смысл? Может:
C++
1
i=sizeof(int)*8-1
Или я что-то путаю?
1
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,672
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
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,672
09.01.2013, 19:46 14
Kgfq, у тебя тоже не все слава богу
число то задом наперед выводится
0
09.01.2013, 19:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2013, 19:46

Извлечь 3 бита числа A, начиная со второго и вставить их в число B, начиная с первого бита
Ввести целое A. Извлечь 3 бита числа A, начиная со второго и вставить их в...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru