Страница 1 из 1

Как переписать один бит в другой? В Си.

Добавлено: Пн окт 24, 2005 07:09
Kria
Как переписать один бит в другой? В Си.
допустим переписать третий бит в первый.

Добавлено: Пн окт 24, 2005 09:34
Злобный
Есть такая операция: OR. Почитай по ней хелп. В си оператор "|", если мне никто не изменяет... Делаешь OR на свою переменную маской, где только 3-й бит равен 1. Это чтобы выставить его в 1. Чтобы сбросить в 0, надо сделать AND (&) с маской, где все биты, кроме 3-го равны 1.

Добавлено: Пн окт 24, 2005 10:02
Kria
Блин как всегда! Недоконца объяснил!
я понятия не имею как работать с битами!
Как их задавать и вообще что они собой представляют!

2Злобный
Всё что ты там написал мне кажется немножко дя другого уровня!
Я конечно ща хэлп проштудирую! Но не знаю что из этого получится!

Добавлено: Пн окт 24, 2005 10:27
Злобный
Kria,
Не помню, как в си объявлеятся 8-битовый инт. Если что, поменяешь, как нужно...

short int a = 15;
short int mask = 0x20; // 00100000b = 20h

//Установка 3-го бита в 1;
a = a | mask;

"До конца" в жизни тебе хер кто когда объяснит. Учись учиться. Как вы программируете, не зная, как хрянятся числа в памяти компьютера? Это на первых уроках давать должны были.

Добавлено: Пн окт 24, 2005 10:33
Лютик
Для "переписывания" тебе придется применить обе описанных Злобным операции - AND для получения значения третьего бита, AND для очистки первого и OR для установки первого.

Добавлено: Пн окт 24, 2005 11:41
Kria
Всем спасибо всё разобрался

int x = 0xF0;
x |= (1 << 3); x &= ~(1 << 6);

устанавливает в 1-ый бит 3-ий и сбрасывает в 0-ой бит 6-ой

[off]добавлено спустя 15 минут:[/off]

Может кто подскажит ответ на другой вопрос!

main()
{
unsigned short u=65535; /*16 bit: 0xFFFF*/
short d=u; /* 15 bit + знаковый бит */
printf("%X %d\n",d,d); /*FFFFFF -1*/
}

какого d стало отрицательным и почему %X печатает больше F чем в исходном коде?

Я понимаю что

интервал short -32768 > 32768
интервал unsigned short 0> 65535 за счёт того что знаковый бит используется под цифры, на почему ответ
FFFF -1 не понимаю

Добавлено: Пн окт 24, 2005 11:50
Злобный
Kria,
Отрицательные числа пишутся в виде доп. кодов. Не так, как положительные... Почитай про хранение в памяти отрицательных чисел. Повторяю, у тебя нет базовых знаний... Их сначала получи.

Добавлено: Пн окт 24, 2005 12:39
Ваганыч
Kria,
Дай угадаю:
Политех. Факультет CIM. 2 курс. Фалько раздал вопросы из Богатырева для промежутки.
Я прав ? :))))

вот про ДК(там же по ссылкам про ПК и ОК):
http://ru.wikipedia.org/wiki/%D0%94%D0% ... 0%BE%D0%B4

[off]добавлено спустя 3 минуты:[/off]

UPD: мда.. по ссылкам про ПК и ОК ничего не сказано :(
подойди к преподу по ASDN в политехе и попроси шоб объяснила :)

Добавлено: Пн окт 24, 2005 23:53
Kria
=) Почти! угадал!
Я все вопросы решил! Вот в этот не врубаюсь, лучше бы мне работу с файлами дали!
Знакомая у меня на 2 курсе в политехе! Попросила помоч! А я ща дома сижу делать нефиг вот и развликаюсь!

Добавлено: Вт окт 25, 2005 12:10
Ваганыч
main()
{
unsigned short u=65535; /*16 bit: 0xFFFF*/
short d=u; /* 15 bit + знаковый бит */
printf("%X %d\n",d,d); /*FFFFFF -1*/
}
Происходит вот что(по крайней мере мне так кажется :) )
u: 16 бит установлены в 1.
d: 15 бит устанорвлены в 1 и старший(знаковый) тоже в 1. Получается типа отрацательное число. Но в компе отрицательный числа хранятся в виде дополнительного кода. Для того чтобы его получить надо инвертировать и прибавить 1. Таким образом:
d: 1111111111111111 (ПК)
d: 1000000000000001 (ДК) == -1

вроде так.