Re[2]: Насыщение
От: Ranger_XL  
Дата: 14.06.05 10:36
Оценка:
ATP>1. Складываю 28 битные целые (четверка бит в запасе есть)
ATP>4. Суммирую не несколько значений в один аккамулятор, а много (НАПРИМЕР также как с случае с увеличением яркости).
ATP>5. Граница должна задаваться в виде 2^N но не включительно, тоесть в случае 2^16 последнее число должно быть 65535

или я чего-то не понимаю, или это тривиально:

int32 mask = 0x0FFFFFFF;
int32 result = (data + num) & mask;
Re[3]: Насыщение
От: ansi  
Дата: 14.06.05 10:47
Оценка:
Здравствуйте, Ranger_XL, Вы писали:

ATP>>1. Складываю 28 битные целые (четверка бит в запасе есть)

ATP>>4. Суммирую не несколько значений в один аккамулятор, а много (НАПРИМЕР также как с случае с увеличением яркости).
ATP>>5. Граница должна задаваться в виде 2^N но не включительно, тоесть в случае 2^16 последнее число должно быть 65535

R_X>или я чего-то не понимаю, или это тривиально:


R_X>int32 mask = 0x0FFFFFFF;

R_X>int32 result = (data + num) & mask;


Limit == 255 (0xFF)

Надо: 255 + 2 == 255
Твой вариант: 255 + 2 == 1 == a + b (mod 256)
new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "SCOOTER — No Fate";
Re[4]: Насыщение
От: ansi  
Дата: 14.06.05 10:54
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Где я ошибаюсь?


Здесь:

ATP>1. (x+y) & ~highbit — получаем 100000000b бит переполнения

ATP>2. (x+y) & (highbit — 1) — получаем маску после наложения маски 000000001b

(x+y)&~highbit | ((x+y)&highbit-1)

255 + 2 == 100000001

100000001 & 111...11011111111 == 1
100000000 — 1 == 11111111

1 | 11111111 == 11111111
new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Ice MC — Laika";
Re[4]: Насыщение
От: Кодт Россия  
Дата: 14.06.05 10:55
Оценка: 2 (1)
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Что-то туплю — не пойму как ваш метод работает

ATP>Например:
ATP>Есть предел 2^8 — 100000000b

ATP>Берем число например 255 и прибавляет 2 получает 257 — 100000001b


ATP>1. (x+y) & ~highbit — получаем 100000000b бит переполнения

ATP>2. (x+y) & (highbit — 1) — получаем маску после наложения маски 000000001b
ATP>3. ORим — получаем 100000001b

ATP>Где я ошибаюсь?


Берём 255+2 = 257 = 1'0000'0010'b.
Значащая часть: S = (x+y)&(highbit-1) = 1'0000'0010'b & 0'1111'1111'b = 0'0000'0010'b.
Бит переполнения: C = (x+y)&highbit = 1'0000'0000'b.
Делаем из него маску: M = C-1 = 1'0000'0000'b — 1 = 0'1111'1111'b.
OR'им: S|M = 0'0000'0010'b | 0'1111'1111'b = 0'1111'1111'b.
Перекуём баги на фичи!
Re[5]: Насыщение
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 14.06.05 14:23
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, AcidTheProgrammer, Вы писали:


ATP>>Что-то туплю — не пойму как ваш метод работает

ATP>>Например:
ATP>>Есть предел 2^8 — 100000000b

ATP>>Берем число например 255 и прибавляет 2 получает 257 — 100000001b


ATP>>1. (x+y) & ~highbit — получаем 100000000b бит переполнения

ATP>>2. (x+y) & (highbit — 1) — получаем маску после наложения маски 000000001b
ATP>>3. ORим — получаем 100000001b

ATP>>Где я ошибаюсь?


К>Берём 255+2 = 257 = 1'0000'0010'b.


Ну всетаки 257 — это 100000001b

К>Значащая часть: S = (x+y)&(highbit-1) = 1'0000'0010'b & 0'1111'1111'b = 0'0000'0010'b.

К>Бит переполнения: C = (x+y)&highbit = 1'0000'0000'b.

Тут все понятно

К>Делаем из него маску: M = C-1 = 1'0000'0000'b — 1 = 0'1111'1111'b.


А вот ту можно поподробней... если С == 0, то C — 1 == -1 == 111111111.....11111
К>OR'им: S|M = 0'0000'0010'b | 0'1111'1111'b = 0'1111'1111'b.

соответственно 0'0000'0001b | 111111....111111b == 11111111111.....11111b ?
Re[6]: Насыщение
От: Кодт Россия  
Дата: 14.06.05 14:41
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

К>>Берём 255+2 = 257 = 1'0000'0010'b.


ATP>Ну всетаки 257 — это 100000001b


Да... маразм не дремлет... конечно же, 100000001.

К>>Значащая часть: S = (x+y)&(highbit-1) = 1'0000'0010'b & 0'1111'1111'b = 0'0000'0010'b.

К>>Бит переполнения: C = (x+y)&highbit = 1'0000'0000'b.

ATP>Тут все понятно


К>>Делаем из него маску: M = C-1 = 1'0000'0000'b — 1 = 0'1111'1111'b.


ATP>А вот ту можно поподробней... если С == 0, то C — 1 == -1 == 111111111.....11111


См выше про маразм.

Маску можно сделать хитрым способом:
Получим значение бита переноса: c = C>>height = 0 или 1
далее маску можно вытягивать из простой 2-элементной таблицы { 0, highbit-1 }
или рожать с помощью хитрой формулы (http://www.rsdn.ru/Forum/?mid=1220781
Автор: Кодт
Дата: 14.06.05
)
Я думаю, табличный способ — наиболее быстрый: таблица всё время будет сидеть в кэше.
Перекуём баги на фичи!
Re[7]: Насыщение
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 14.06.05 16:08
Оценка: 22 (1)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, AcidTheProgrammer, Вы писали:


К>>>Берём 255+2 = 257 = 1'0000'0010'b.


ATP>>Ну всетаки 257 — это 100000001b


К>Да... маразм не дремлет... конечно же, 100000001.


К>>>Значащая часть: S = (x+y)&(highbit-1) = 1'0000'0010'b & 0'1111'1111'b = 0'0000'0010'b.

К>>>Бит переполнения: C = (x+y)&highbit = 1'0000'0000'b.

ATP>>Тут все понятно


К>>>Делаем из него маску: M = C-1 = 1'0000'0000'b — 1 = 0'1111'1111'b.


ATP>>А вот ту можно поподробней... если С == 0, то C — 1 == -1 == 111111111.....11111


К>См выше про маразм.


К>Маску можно сделать хитрым способом:

К>Получим значение бита переноса: c = C>>height = 0 или 1
К>далее маску можно вытягивать из простой 2-элементной таблицы { 0, highbit-1 }
К>или рожать с помощью хитрой формулы (http://www.rsdn.ru/Forum/?mid=1220781
Автор: Кодт
Дата: 14.06.05
)

К>Я думаю, табличный способ — наиболее быстрый: таблица всё время будет сидеть в кэше.

У меня тоже маразм вечерний..... поэтому не могу точно понять подойдет ли следующий спосом:

Получам Index 0 или 1
Потом без всякой таблицы умножаем 0 или 1 на маску highbit-1 и OR орим с тем что получилось ранне
Короче:

A = (x + y)
C = A & ~high;
B = A & (high — 1);
I = C >> high;

SUM = I * (high — 1) | B;

Помоему так .....
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.