реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> инвертировать один бит
sergey sva
сообщение Feb 11 2010, 09:48
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Нужно инвертировать один бит, в переменной, подозреваю что делается очень просто smile.gif, но что то не соображу как.

#define dataflag (1<<6)
ReturnValue =(ReturnValue ~ dataflag);
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 11 2010, 09:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



ReturnValue ^= dataflag
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 11 2010, 09:52
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Понял. спасибо. smile.gif
Go to the top of the page
 
+Quote Post
yurmala
сообщение Mar 2 2011, 05:57
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814



а такая конструкция работает?
FIO0PIN ^= (1<<19);
что-то при отладке через keil смотрю - инвертируются какие-то левые биты порта 0, но не 19-й...
Go to the top of the page
 
+Quote Post
V_G
сообщение Mar 2 2011, 06:46
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



А какого типа (в смысле длины в битах) переменная FIO0PIN?
И какого типа (в смысле длины в битах) константа (1<<19)? Может, в вашем компиляторе надо писать (1L<<19)?
Go to the top of the page
 
+Quote Post
yurmala
сообщение Mar 2 2011, 08:28
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814



Цитата(V_G @ Mar 2 2011, 11:46) *
А какого типа (в смысле длины в битах) переменная FIO0PIN?
И какого типа (в смысле длины в битах) константа (1<<19)? Может, в вашем компиляторе надо писать (1L<<19)?

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

правильно ли это?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 2 2011, 10:30
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



С точки зрения языка конструкция FIO0PIN ^= (1<<19); - правильная. Но вам надо очень внимательно читать описание этого регистра - возможно запись единиц в него дает какие-то побочные эффекты, возможно он вообще не предназанчен для записи.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
yurmala
сообщение Mar 2 2011, 10:51
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814



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

в какой-то момент ошибка ушла. работает.
возможно действительно где-то своим ошибочным кодом порождал побочный эффект.
в любом случае спасибо.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Mar 3 2011, 06:37
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



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

1L<<19 Или нет?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 3 2011, 07:17
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Bill
сообщение Mar 3 2011, 07:47
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



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

А почему L пользы не принесет, а U - принесет? Какая между ними разница при 32-х разрядах?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 3 2011, 10:04
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Bill
сообщение Mar 3 2011, 11:37
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(_Bill @ Mar 3 2011, 11:47) *
А почему L пользы не принесет, а U - принесет? Какая между ними разница при 32-х разрядах?

Спасибо! Понял.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 10:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01437 секунд с 7
ELECTRONIX ©2004-2016