Определение ближайшего числа, делимого нацело на 4
От: Аноним  
Дата: 25.04.11 04:21
Оценка: :))) :))
Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.

Можно сделать циклом:

int a = 5;
int b;
for(b=a+1;(b%4);b++);


Но мне кажется есть более простое решение ...
Re: Определение ближайшего числа, делимого нацело на 4
От: batu Украина  
Дата: 25.04.11 04:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.


А>Можно сделать циклом:


А>
А>int a = 5;
А>int b;
А>for(b=a+1;(b%4);b++);
А>


А>Но мне кажется есть более простое решение ...

Убрать последние два бита и прибавить 4.
Re: Определение ближайшего числа, делимого нацело на 4
От: sand7e Россия  
Дата: 25.04.11 04:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.


А>Можно сделать циклом:


А>
А>int a = 5;
А>int b;
А>for(b=a+1;(b%4);b++);
А>


А>Но мне кажется есть более простое решение ...


b=(a>>2)<<2+4;
Re: Определение ближайшего числа, делимого нацело на 4
От: andy1618 Россия  
Дата: 25.04.11 04:57
Оценка: +1 -1
Здравствуйте, Аноним, Вы писали:

b=(a+3) & 0xFFFFFFFD;

Подходит и для чисел, которые уже делятся на 4.

Warn: по уму надо ещё написать юнит-тесты, чтобы проверить/продумать поведение при переполнении и для отрицательных чисел.
Re[2]: Определение ближайшего числа, делимого нацело на 4
От: HunteX http://troyashka.ru/
Дата: 25.04.11 05:14
Оценка: 1 (1) :)
Здравствуйте, andy1618, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>b=(a+3) & 0xFFFFFFFD;


A>Подходит и для чисел, которые уже делятся на 4.


A>Warn: по уму надо ещё написать юнит-тесты, чтобы проверить/продумать поведение при переполнении и для отрицательных чисел.


Мне страшно ) Объясните откуда это ?
Re[2]: Определение ближайшего числа, делимого нацело на 4
От: rg45 СССР  
Дата: 25.04.11 06:00
Оценка: 13 (5) -1
Здравствуйте, andy1618, Вы писали:

A>b=(a+3) & 0xFFFFFFFD;


Только не 0xFFFFFFFD, а 0xFFFFFFFC. А чтоб избежать подобных ошибок, числовой литерал можно заменить константным выражением:

int round_up_to_4 (int x) 
{ 
  return (x + 3) & ~3; 
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: Определение ближайшего числа, делимого нацело на 4
От: ilnar Россия  
Дата: 25.04.11 06:55
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.


int a = 5;
int b = (a + 4-1) & ~(4-1);
Re[3]: Определение ближайшего числа, делимого нацело на 4
От: andy1618 Россия  
Дата: 25.04.11 08:20
Оценка:
Здравствуйте, rg45, Вы писали:

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


A>>b=(a+3) & 0xFFFFFFFD;


R>Только не 0xFFFFFFFD, а 0xFFFFFFFC.


Точно, этот "D" мне с самого начала показался подозрительным, но проверить не удосужился
Опять же, к вопросу о пользе юнит-тестов


R>А чтоб избежать подобных ошибок, числовой литерал можно заменить константным выражением:

R>
R>int round_up_to_4 (int x) 
R>{ 
R>  return (x + 3) & ~3; 
R>}
R>


Да, так заодно будет работать и для чисел с разрядностью, отличной от 32 бит.
Re[4]: Определение ближайшего числа, делимого нацело на 4
От: ilnar Россия  
Дата: 25.04.11 08:23
Оценка:
Здравствуйте, andy1618, Вы писали:

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


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


A>>>b=(a+3) & 0xFFFFFFFD;


R>>Только не 0xFFFFFFFD, а 0xFFFFFFFC.


A>Точно, этот "D" мне с самого начала показался подозрительным, но проверить не удосужился

A>Опять же, к вопросу о пользе юнит-тестов

если не хардкодить константы вручную, и юнит тестов не надо))
b=(a + 4-1) & ~(4-1)
Re[2]: Определение ближайшего числа, делимого нацело на 4
От: ilnar Россия  
Дата: 25.04.11 08:32
Оценка: +1
Здравствуйте, ilnar, Вы писали:

I>Здравствуйте, Аноним, Вы писали:


А>>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.


I>
I>int a = 5;
I>int b = (a + 4-1) & ~(4-1);
I>


единственное ограничение, так можно только со степенями двойки ((
если не степень двойки (например, 3), то
int a = 5;
int b = (a + 3-1) - ((a + 3-1) % 3);
Re[5]: Определение ближайшего числа, делимого нацело на 4
От: andy1618 Россия  
Дата: 25.04.11 09:30
Оценка:
Здравствуйте, ilnar, Вы писали:

I>если не хардкодить константы вручную, и юнит тестов не надо))

I>b=(a + 4-1) & ~(4-1)

Угу, а потом будем удивляться, почему у нас при a близком к INT_MAX на выходе отрицательные числа вылезут
Зависит, конечно, от приложения, но, к примеру, на старой работе (финансовые модули) такую халяву на испекции бы точно зарубили, кому нужны иски на 4 миллиарда у.е.?
Re[6]: Определение ближайшего числа, делимого нацело на 4
От: ilnar Россия  
Дата: 25.04.11 09:49
Оценка:
Здравствуйте, andy1618, Вы писали:

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


I>>если не хардкодить константы вручную, и юнит тестов не надо))

I>>b=(a + 4-1) & ~(4-1)

A>Угу, а потом будем удивляться, почему у нас при a близком к INT_MAX на выходе отрицательные числа вылезут

A>Зависит, конечно, от приложения, но, к примеру, на старой работе (финансовые модули) такую халяву на испекции бы точно зарубили, кому нужны иски на 4 миллиарда у.е.?

разве там не свои типы для счета денег, включающие разные алгоритмы округления?
Re[7]: Определение ближайшего числа, делимого нацело на 4
От: andy1618 Россия  
Дата: 25.04.11 12:41
Оценка:
Здравствуйте, ilnar, Вы писали:

I>>>если не хардкодить константы вручную, и юнит тестов не надо))

I>>>b=(a + 4-1) & ~(4-1)

A>>Угу, а потом будем удивляться, почему у нас при a близком к INT_MAX на выходе отрицательные числа вылезут

A>>Зависит, конечно, от приложения, но, к примеру, на старой работе (финансовые модули) такую халяву на испекции бы точно зарубили, кому нужны иски на 4 миллиарда у.е.?

I>разве там не свои типы для счета денег, включающие разные алгоритмы округления?


Конечно, там всё, что связано с активами, считалось предельно аккуратно. Но и в других модулях отношение к потенциальным "спецэффектам" (переполнения, ошибки off-by-one и т.п.) было серьёзное, т.к. код проходил по классу риска "невосполнимые финансовые потери".
Re: Определение ближайшего числа, делимого нацело на 4
От: BulatZiganshin  
Дата: 25.04.11 17:42
Оценка: +4
Здравствуйте, Аноним, Вы писали:

А>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.


a/4*4+4

вместо того чтобы маяться хернёй с bit fiddling and unit tests around it
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: Определение ближайшего числа, делимого нацело на 4
От: ilnar Россия  
Дата: 25.04.11 19:03
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>Здравствуйте, Аноним, Вы писали:


А>>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.


BZ>a/4*4+4


BZ>вместо того чтобы маяться хернёй с bit fiddling and unit tests around it


это смотря сколько раз этот код выполняться будет
Re[3]: Определение ближайшего числа, делимого нацело на 4
От: BulatZiganshin  
Дата: 25.04.11 19:09
Оценка: :)
Здравствуйте, ilnar, Вы писали:

BZ>>a/4*4+4


BZ>>вместо того чтобы маяться хернёй с bit fiddling and unit tests around it


I>это смотря сколько раз этот код выполняться будет


даже я, человек написавший самый быстрый архиватор в мире, в 99% случаев пишу код который не нуждается в оптимизации. сомневаюсь, что у вас, а тем более студента задавшего вопрос, этот показатель больше. а весь выигрыш тут, страшно сказать, в одной ар. операции, и то если ступит компилятор. скорее всё же дело в вашем желании выпендриться, продемонстрировать что вы знаете такие хитрые способы, даром что это приведёт к тому что над задачей вы продумали вдесятеро дольше плюс ещё понадобилось писать юнит-тесты чтоб найти ошибку
Люди, я люблю вас! Будьте бдительны!!!
Re[4]: assert
От: igna Россия  
Дата: 26.04.11 08:25
Оценка:
Здравствуйте, andy1618, Вы писали:

A>Опять же, к вопросу о пользе юнит-тестов


Может в данном случае assert достаточен?

assert(b % 4 == 0 && b > a && b - 4 <= a );
Re[2]: Определение ближайшего числа, делимого нацело на 4
От: rg45 СССР  
Дата: 26.04.11 08:33
Оценка: +1
Здравствуйте, BulatZiganshin, Вы писали:

А>>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.


BZ>a/4*4+4


BZ>вместо того чтобы маяться хернёй с bit fiddling and unit tests around it


Херней, говоришь? А проверь-ка свое решение для a = 4, получается 8.

А теперь давай исправим ошибку, да не забудем про отрицательную область определения:
a < 0 ? a / 4 * 4 : (a + 3) / 4 * 4


А теперь давай сравним с "херней":
(a + 3) & ~3
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: Определение ближайшего числа, делимого нацело на 4
От: BSDыщъх  
Дата: 26.04.11 08:34
Оценка: 1 (1) +1 -2
Здравствуйте, rg45, Вы писали:

R> А чтоб избежать подобных ошибок, числовой литерал можно заменить константным выражением:


R>
R>int round_up_to_4 (int x) 
R>{ 
R>  return (x + 3) & ~3; 
R>}
R>


Подобный код, конечно, широко используется, но условию задачи не удовлетворяет.
Топикстартеру требуется значение строго больше исходного.
Sine vilitate, sine malitiosa mente
Re[3]: Определение ближайшего числа, делимого нацело на 4
От: Denis Mingulov Финляндия http://denis.mingulov.com
Дата: 26.04.11 08:35
Оценка: 16 (1)
Здравствуйте, rg45, Вы писали:

А>>>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.

BZ>>a/4*4+4
BZ>>вместо того чтобы маяться хернёй с bit fiddling and unit tests around it
R>Херней, говоришь? А проверь-ка свое решение для a = 4, получается 8.
И?

R>А теперь давай исправим ошибку, да не забудем про отрицательную область определения:

Какую ошибку-то? Условие не читали, что ли?

Кстати, это третье или второе сообщение? Или даже четвертое?
Еще один раз переотвечать не буду, а для "Мусора" у меня прав нет.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.