Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2012, 19:15   #1
sheff123
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 21
По умолчанию Вывести числа, из диапазона от n до m у которых, количество единичных разрядов в двоичном представлении числа нечетно

Вывести числа, из диапазона от n до m у которых, количество единичных разрядов в двоичном представлении числа нечетно. Использовать операции сдвига и побитового умножения.


Хотелось бы увидеть примеры.
sheff123 вне форума Ответить с цитированием
Старый 03.01.2012, 19:26   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Код:
//------ Подсчет количества единичных разрядов С++
 int what_is_1( unsigned long n)
 { int i,s;
 for (i=0,s=0; i < sizeof(long) * 8; i++)
      { if (n & 1) s++; n >>=1; }                  // Проверить младший разряд и сдвинуть слово
 return s; }
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 03.01.2012, 19:28   #3
sheff123
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Mad_Cat Посмотреть сообщение
Код:
//------ Подсчет количества единичных разрядов С++
 int what_is_1( unsigned long n)
 { int i,s;
 for (i=0,s=0; i < sizeof(long) * 8; i++)
      { if (n & 1) s++; n >>=1; }                  // Проверить младший разряд и сдвинуть слово
 return s; }
а как перевести из десятичной системы в двоичную?
sheff123 вне форума Ответить с цитированием
Старый 03.01.2012, 19:30   #4
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
а как перевести из десятичной системы в двоичную
а зачем переводить?
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 03.01.2012, 20:12   #5
sheff123
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Mad_Cat Посмотреть сообщение
а зачем переводить?
а как сделать? поясните.... я в этом разделе не бум-бум(
sheff123 вне форума Ответить с цитированием
Старый 03.01.2012, 20:17   #6
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

функция what_is_1 получает на вход число в десятичной системе(n) а на выдает число единиц в двоичном представлении этого числа(s)
вам осталось добавить цикл от n до m и проверку результата функции на четность
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 05.01.2012, 14:40   #7
sheff123
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Mad_Cat Посмотреть сообщение
функция what_is_1 получает на вход число в десятичной системе(n) а на выдает число единиц в двоичном представлении этого числа(s)
вам осталось добавить цикл от n до m и проверку результата функции на четность
это все конечно хорошо, в цикл я впихну функцию и на четность проверю, но я не понимаю как работает сама функция.
int what_is_1( unsigned long n) //понятно передали число n в функцию
{ int i,s;
for (i=0,s=0; i < sizeof(long) * 8; i++) //здесь что???
{ if (n & 1) s++; n >>=1; } // Проверить младший разряд и сдвинуть слово
return s; } как я понял S это кол-во единиц в двочном представлении..
не понимаю как работает сам цикл(
sheff123 вне форума Ответить с цитированием
Старый 05.01.2012, 14:57   #8
AlexDark
Форумчанин
 
Аватар для AlexDark
 
Регистрация: 23.12.2011
Сообщений: 117
По умолчанию

Код:
int what_is_1( unsigned long n) //понятно передали  число n в функцию
 { int i,s; 

 for (i=0,s=0; i < sizeof(long) * 8; i++)  
/* i-текущий разряд (бит) от 0 до размера числа n в байтах умноженного на 8 т.е. проход по всем разрядам */
      

{ if (n & 1) s++; n >>=1; }                  
/* Проверить младший разряд и сдвинуть слово ( т.е. выполняем побитовое "И"  числа N с 0...001 ) и собственно сдвигаем слово */

 return s; } // возвращаем кол-во единиц
Например для числа 6 ( 0..0110 )
1. 0...0110 & 0...0001 = 0...0000 (0 - false) -> не прибавляем s, сдвигаем n влево
(n = 0..0011)
2. 0...0011 & 0...0001 = 0...0001 (1 - true) -> прибавляем s, сдвигаем N (n=0...0001)

И так далее на следующем шаге прибавляем еще 1, а после него все нули. Результирующее s=2.

Последний раз редактировалось AlexDark; 05.01.2012 в 15:00.
AlexDark вне форума Ответить с цитированием
Старый 05.01.2012, 15:35   #9
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

sheff123

Вывести числа, из диапазона от n до m у которых, количество единичных разрядов в двоичном представлении числа нечетно. Использовать операции сдвига и побитового умножения.

Хотелось бы увидеть примеры.


Пример на C++
Проверено на Visual Studio 2010
Код:
#include <iostream>
#include <locale>

#include <functional>
#include <algorithm>
#include <iterator>

#include <intrin.h>

#include <stdlib.h>
#include <time.h>

template <typename T>
struct population_matcher : public std::unary_function<T, bool>
{
	population_matcher(size_t n) : n_(n) {}

	bool operator()(T val) const
	{
		return __popcnt(val) == n_;
	}

	size_t n_;
};

template <typename T>
struct in_range : public std::unary_function<T, bool>
{
	in_range(T left, T right) : left_(left), right_(right) {}

	bool operator()(T val) const
	{
		return val >= left_ && val <= right_;
	}

	T left_, right_;
};

template <typename _Ty1, typename _Ty2>
struct functional_and : public std::unary_function<typename _Ty1::argument_type, bool>
{
	functional_and(_Ty1 op1, _Ty2 op2) : op1_(op1), op2_(op2) {}

	bool operator()(typename _Ty1::argument_type val) const
	{
		return op1_(val) && op2_(val);
	}

	_Ty1 op1_;
	_Ty2 op2_;
};

template <typename _Ty1, typename _Ty2>
functional_and<_Ty1, _Ty2> _and(_Ty1 op1, _Ty2 op2)
{
	return functional_and<_Ty1, _Ty2>(op1, op2);
}

struct R : public std::unary_function<void, int>
{
	int operator()() const
	{
		return rand() % 100;
	}
};

int main()
{
	setlocale(LC_ALL, "");

	srand((unsigned) time(nullptr));

	int arr[10];
	std::generate_n(arr, sizeof(arr)/sizeof(arr[0]), R());

	typedef std::ostream_iterator<int> O;

	std::cout << "Original array: ";
	std::copy(arr, arr + sizeof(arr)/sizeof(arr[0]), O(std::cout, " "));
	std::cout << std::endl;

	std::cout << "Filtered array: ";
	std::remove_copy_if(arr, arr + sizeof(arr)/sizeof(arr[0]), O(std::cout, " "), std::not1(_and(in_range<int>(20, 80), population_matcher<int>(3))));
	std::cout << std::endl;

	return 0;
}
Пример вывода результата:

Код:
Original array: 49 69 37 55 6 11 34 27 12 45
Filtered array: 49 69 37
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Восстановление двоичного числа по массиву из значений его разрядов Lyubimov Помощь студентам 3 15.04.2011 17:07
C++ Вывести на экран все натуральные числа из диапазона от A до B, в записи которых цифра 7 встречается maloy0103 Помощь студентам 1 27.12.2010 00:17
Вывести числа целого неотр. числа Gonzo Помощь студентам 11 04.05.2010 16:55
вводим два числа, получить все меньшие n натуральные числа, квадрат суммы цифр которых равен m Sparky Помощь студентам 2 22.11.2009 21:59
Как числа в двоичном виде вывести в столбик по 4 числа? Equalizer Общие вопросы C/C++ 11 27.09.2009 14:15