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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2017, 13:05   #1
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию Замена значения (побитовые операции)

1.ф-я принимает на вход некоторое число и позицию бита в данном числе
ф-я должна для числа заменить бит на 1 на той позиции и вернуть новое значение
2.ф-я принимает на вход некоторое число и позицию бита в данном числе
ф-я должна для числа заменить бит на 0 на той позиции и вернуть новое значение
Тоесть в впервом задании заменить значения на позии на 1 . А в втором задании заменить на 0.
Мой код:
Код:
template <typename T>
bool IsOff(T number, std::uint8_t pos)
{
	return (number & (T(1) << pos)) == 0;
}

template <typename T>
bool IsOn(T number, std::uint8_t pos)
{
	return (number & (T(1) << pos)) != 0;
}

template <typename T>
T SetBitOn(T number, std::uint8_t bitPos) 
{
	if (IsOff(number, bitPos)) 
		number |= (T(1) << bitPos);
	return number;
}

template <typename T>
T SetBitOff(T number, std::uint8_t bitPos) 
{
	if (IsOn(number, bitPos))
		number = number & (T(0));
	return number;
}
Но оно и мне перетирает все значения. не только на позиции которая мне нужна. Нужна ваша помощь
dimaSlon вне форума Ответить с цитированием
Старый 15.11.2017, 13:22   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

1. Оно делает ровно то, что вы написали. У вас же маска 0. Вы когда гуглили установку/сброс битов не заметили там значок, типа ~?

2. Зачем для сброса/установки бита проверять его значение дополнительно? Вам нечем проц занять?
p51x вне форума Ответить с цитированием
Старый 15.11.2017, 13:23   #3
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

а используете функции как? Где сам код main?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 15.11.2017, 13:29   #4
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
а используете функции как? Где сам код main?
Код:
int main()
{

	std::cout << NumberPowerOne(2, 3) << "\n";

	std::cout << NumberPowerZero(0b01010010, 1) << "\n";

	
}
dimaSlon вне форума Ответить с цитированием
Старый 15.11.2017, 13:31   #5
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
1. Оно делает ровно то, что вы написали. У вас же маска 0. Вы когда гуглили установку/сброс битов не заметили там значок, типа ~?

2. Зачем для сброса/установки бита проверять его значение дополнительно? Вам нечем проц занять?
Нет я не заметил ~) . можете на примере одного задания показать. где я фигню написал. А то я не совсем понял о чем вы.
Или вы про ~ ( NOT ) ?

Последний раз редактировалось dimaSlon; 15.11.2017 в 13:33.
dimaSlon вне форума Ответить с цитированием
Старый 15.11.2017, 13:31   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Еще раз number & (T(0)); у вас маска 0, она всегда сбросит ВСЕ биты.

установка бита: a |= (1 << number)
сброс бита: a &= ~(1 << number)

Последний раз редактировалось p51x; 15.11.2017 в 13:34.
p51x вне форума Ответить с цитированием
Старый 15.11.2017, 13:47   #7
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Еще раз number & (T(0)); у вас маска 0, она всегда сбросит ВСЕ биты.

установка бита: a |= (1 << number)
сброс бита: a &= ~(1 << number)
cпасибо
Сделал:
Код:
template <typename T>
T SetBitOn(T number, std::uint8_t bitPos) 
{
	if (IsOff(number, bitPos))
		number |= (T(1) << bitPos);
	return number;
}

template <typename T>
T SetBitOff(T number, std::uint8_t bitPos) 
{
	if (IsOn(number, bitPos))
		number &= ~(T(1) << bitPos);
	return number;
}
Выводит и работает правильно
dimaSlon вне форума Ответить с цитированием
Старый 15.11.2017, 13:54   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

свои if выкиньте нафик
p51x вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Побитовые операции alexusankov C# (си шарп) 6 01.12.2013 22:38
С++ побитовые операции Rus5 Помощь студентам 0 28.05.2013 22:34
Побитовые операции Unique Паскаль, Turbo Pascal, PascalABC.NET 3 29.08.2010 18:50
Побитовые операции С++ Defa4ka Помощь студентам 4 22.06.2010 14:55
побитовые операции Александе еть я Общие вопросы C/C++ 2 18.04.2010 13:31