Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: инвертировать один бит
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
sergey sva
Нужно инвертировать один бит, в переменной, подозреваю что делается очень просто smile.gif, но что то не соображу как.

#define dataflag (1<<6)
ReturnValue =(ReturnValue ~ dataflag);
aaarrr
ReturnValue ^= dataflag
sergey sva
Понял. спасибо. smile.gif
yurmala
а такая конструкция работает?
FIO0PIN ^= (1<<19);
что-то при отладке через keil смотрю - инвертируются какие-то левые биты порта 0, но не 19-й...
V_G
А какого типа (в смысле длины в битах) переменная FIO0PIN?
И какого типа (в смысле длины в битах) константа (1<<19)? Может, в вашем компиляторе надо писать (1L<<19)?
yurmala
Цитата(V_G @ Mar 2 2011, 11:46) *
А какого типа (в смысле длины в битах) переменная FIO0PIN?
И какого типа (в смысле длины в битах) константа (1<<19)? Может, в вашем компиляторе надо писать (1L<<19)?

32-разрядные (LPC2478)
но тут в другом дело. замаскировал все другие биты и стало все нормально.
FIO0MASK = ~(1<<19);
FIO0PIN ^= (1<<19);

правильно ли это?
Сергей Борщ
С точки зрения языка конструкция FIO0PIN ^= (1<<19); - правильная. Но вам надо очень внимательно читать описание этого регистра - возможно запись единиц в него дает какие-то побочные эффекты, возможно он вообще не предназанчен для записи.
yurmala
Цитата(Сергей Борщ @ Mar 2 2011, 15:30) *
С точки зрения языка конструкция FIO0PIN ^= (1<<19); - правильная. Но вам надо очень внимательно читать описание этого регистра - возможно запись единиц в него дает какие-то побочные эффекты, возможно он вообще не предназанчен для записи.

в какой-то момент ошибка ушла. работает.
возможно действительно где-то своим ошибочным кодом порождал побочный эффект.
в любом случае спасибо.
_Bill
Цитата(yurmala @ Mar 2 2011, 09:57) *
а такая конструкция работает?
FIO0PIN ^= (1<<19);
что-то при отладке через keil смотрю - инвертируются какие-то левые биты порта 0, но не 19-й...

1L<<19 Или нет?
Сергей Борщ
QUOTE (_Bill @ Mar 3 2011, 08:37) *
1L<<19 Или нет?
Или нет. int 32-битный. long также 32-битный. Даже для сдвига на 31 бит достаточно 1U<<31, для меньших можно и без квалификаторов. L пользы не принесет.
_Bill
Цитата(Сергей Борщ @ Mar 3 2011, 11:17) *
Или нет. int 32-битный. long также 32-битный. Даже для сдвига на 31 бит достаточно 1U<<31, для меньших можно и без квалификаторов. L пользы не принесет.

А почему L пользы не принесет, а U - принесет? Какая между ними разница при 32-х разрядах?
Сергей Борщ
QUOTE (_Bill @ Mar 3 2011, 09:47) *
А почему L пользы не принесет, а U - принесет?
L пользы не принесет потому что 1 что с ним, что без него 32-битная знаковая. А U дает unsigned 1, нет предупреждения "операция приводит к смене знака".
_Bill
Цитата(_Bill @ Mar 3 2011, 11:47) *
А почему L пользы не принесет, а U - принесет? Какая между ними разница при 32-х разрядах?

Спасибо! Понял.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.