Форум «Всё о Паскале» _ Ада и другие языки _ Установка 1-цы в разряд
Автор: 18192123 24.04.2009 22:10
Здравствуйте! Имеется некоторое число, мне требуется в 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-тым разрядом? Объясните пожалуйста..
Автор: volvo 24.04.2009 22:21
Тебе надо битовый OR, а ты делаешь логический (в битовом - один символ |, в логическом - два. А какая разница...)
Автор: 18192123 24.04.2009 22:37
Цитата(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-м разряде в маске должна была увеличить число.. Как исправить, скажите пожалуйста..
Автор: volvo 24.04.2009 22:47
Цитата
Ой..перепутала..
Поэтому я предпочитаю использовать сокращенную запись, компилятор не даст тебе перепутать...
Цитата
в итоге ничего не изменилось..
Почему не обращаешь внимание на Warning-и? Компилятор же тебя должен был предупредить, что "Integer arithmetic overflow"? Сразу понятно, что число в результате превышает допустимые рамки, а значит, маска слишком большая. Понятно, куда копать. Или ты отключила отображение Warning-ов? Ну, тогда пожинай плоды...
Твоя маска слишком велика для unsigned int... Не путай двоичную и 16-ричную системы счисления. В 16-ричной каждая цифра представляется четырьмя битами. Если тебе надо маску 1000 0000 0000 00012, то это соответственно 800116 = 0x8001