IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Установка 1-цы в разряд, С++ Builder
18192123
сообщение 24.04.2009 18:10
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Здравствуйте!
Имеется некоторое число, мне требуется в 1-й и 16-й его разряды установить по 1-це, независимо от того, что там было ранее..
например, p=11 0001 1101 1010
нужно получить p=1011 0001 1101 1011
вот так пробовала с 1-м разрядом:

unsigned int p,temp;
randomize();
p=rand();
temp=0x1;
p=p||temp;


в итоге чем бы не было р, оно становится равным temp, т.е. 0х1..
и ещё..как быть с 16-тым разрядом?
Объясните пожалуйста..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 3)
volvo
сообщение 24.04.2009 18:21
Сообщение #2


Гость






Тебе надо битовый OR, а ты делаешь логический (в битовом - один символ |, в логическом - два. А какая разница...)
 К началу страницы 
+ Ответить 
18192123
сообщение 24.04.2009 18:37
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 24.04.2009 19:21) *

Тебе надо битовый OR

Ой..перепутала..

А насчёт 1-цы в 16-й разряд..

unsigned int p;
randomize();
p=rand();
p=p|0x1000000000000001;


тестировала при p=6907 (1 1010 1111 1011)
в итоге ничего не изменилось..в 1-м разряде и не должно было ничего меняться, а вот 1-чка в 16-м разряде в маске должна была увеличить число..
Как исправить, скажите пожалуйста..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.04.2009 18:47
Сообщение #4


Гость






Цитата
Ой..перепутала..
Поэтому я предпочитаю использовать сокращенную запись, компилятор не даст тебе перепутать...

Цитата
в итоге ничего не изменилось..
Почему не обращаешь внимание на Warning-и? Компилятор же тебя должен был предупредить, что "Integer arithmetic overflow"? Сразу понятно, что число в результате превышает допустимые рамки, а значит, маска слишком большая. Понятно, куда копать. Или ты отключила отображение Warning-ов? Ну, тогда пожинай плоды...

Твоя маска слишком велика для unsigned int... Не путай двоичную и 16-ричную системы счисления. В 16-ричной каждая цифра представляется четырьмя битами. Если тебе надо маску 1000 0000 0000 00012, то это соответственно 800116 = 0x8001

  // p = 6907
p |= 0x8001;
// p = 39675
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 26.07.2025 23:54
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"