Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приоритет и очередность вычислений, Очередность вычислений не верная 
:(
    Опции темы
FiMa1
Дата 11.4.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Согласно Керниган, Ритчи, рассчитываю на очередность (см. код ниже):
1. Выражение в скобках, где выполняется (а) ~0 (б) UINT32SIZE - n (в) сдвиг
2. Сдвиг результата от действий в скобках на p.

Помогите, плз, разобраться где я наврал...

Код

typedef unsigned uint32;

#define SIZEOFBYTE 8
#define UINT32SIZE sizeof(uint32)*SIZEOFBYTE

uint32 turnoffbites(uint32 x, int p, int n);

int main(void)
{
    uint32 i = turnoffbites(2, 0, 1);

    return 0;
}

/* turns off n bits of the x, from p position */
uint32 turnoffbites(uint32 x, int p, int n)
{
    /* create the mask РАБОЧИЙ ВАРИАНТ */ 
    uint32 m = ~0;
    m = (m >> UINT32SIZE - n) << p;

    /* create the mask НЕРАБОЧИЙ ВАРИАНТ  
    uint32 m = (~0 >> UINT32SIZE - n) << p;*/

    /* cut bits and return the result */
    return x & (~m);
}


Пробовал также вариант uint32 m = (~0 >> 32 - n) << p; чтобы не учитывать операторы макроса для UINT32SIZE...

Это сообщение отредактировал(а) FiMa1 - 11.4.2007, 12:59
PM   Вверх
ama_kid
Дата 11.4.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



что-то я не совсем понял, что тебе надо... Чтобы нерабочий вариант работал так же как рабочий?
ну сделай приведение типа 0 явно:
uint32 m = (~(uint32)0 >> (UINT32SIZE - n)) << p;
Или я не о том?


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
FiMa1
Дата 11.4.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Цитата(ama_kid @ 11.4.2007,  14:34)
что-то я не совсем понял, что тебе надо... Чтобы нерабочий вариант работал так же как рабочий?
ну сделай приведение типа 0 явно:
uint32 m = (~(uint32)0 >> (UINT32SIZE - n)) << p;
Или я не о том?

Все так, спасибо. А без явного приведения никак? Почему у Кернигана с Ритчи прокатывает вариант:

Код

/* getbits: получает n бит, начиная с p-й позиции */
unsigned getbits(unsigned x, int p, int n)
{
    return (x >> (p+1-n)) & ~(~0 << n);
}

PM   Вверх
SerpentVV
Дата 12.4.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

Репутация: 1
Всего: 1



Скорее всего потому, что они писали про язык С, а ты компилируешь в С++.
А С и С++ - две большие разницы...

PM MAIL   Вверх
FiMa1
Дата 12.4.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Цитата(SerpentVV @ 12.4.2007,  09:24)
Скорее всего потому, что они писали про язык С, а ты компилируешь в С++.
А С и С++ - две большие разницы...

Ответ - нет.. 
Все варианты (и Ритчи и мои) компилировались в MS Visual Studio .NET 2003, проекты заводились как С++. Вариант Керниганf&Ритчи работает согласно задумке:
Цитата

Для иллюстрации некоторых побитовых операций рассмотрим функцию getbits(x, p, n), которая формирует поле в n битов, вырезанных из x, начиная с позиции p, прижимая его к правому краю. Предполагается, что 0-й бит - крайний правый бит, а n и p- осмысленные положительные числа. Например, getbits(x,4,3) вернет в качестве результата 4, 3 и 2-й биты значения x, прижимая их к правому краю:
Код

/* getbits: получает n бит, начиная с p-й позиции */
unsigned getbits(unsigned x, int p, int n)
{
    return (x >> (p+1-n)) & ~(~0 << n);
}


В моём же варианте непорядок...
PM   Вверх
vinter
Дата 12.4.2007, 16:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(FiMa1 @  12.4.2007,  15:47 Найти цитируемый пост)
Ответ - нет.. 


Цитата(SerpentVV @  12.4.2007,  09:24 Найти цитируемый пост)
они писали про язык С


Цитата(FiMa1 @  12.4.2007,  15:47 Найти цитируемый пост)
 проекты заводились как С++

ответ понятен?


--------------------
Мой блог
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0777 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.