Определение ближайшего числа, делимого нацело на 4
От:
Аноним
Дата:
25.04.11 04:21
Оценка:
Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.
Можно сделать циклом:
int a = 5;
int b;
for(b=a+1;(b%4);b++);
Но мне кажется есть более простое решение ...
Re: Определение ближайшего числа, делимого нацело на 4
Здравствуйте, Аноним, Вы писали:
А>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.
А>Можно сделать циклом:
А>
А>int a = 5;
А>int b;
А>for(b=a+1;(b%4);b++);
А>
А>Но мне кажется есть более простое решение ...
Убрать последние два бита и прибавить 4.
Re: Определение ближайшего числа, делимого нацело на 4
Здравствуйте, Аноним, Вы писали:
А>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.
А>Можно сделать циклом:
А>
А>int a = 5;
А>int b;
А>for(b=a+1;(b%4);b++);
А>
А>Но мне кажется есть более простое решение ...
b=(a>>2)<<2+4;
Re: Определение ближайшего числа, делимого нацело на 4
Здравствуйте, andy1618, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
A>b=(a+3) & 0xFFFFFFFD;
A>Подходит и для чисел, которые уже делятся на 4.
A>Warn: по уму надо ещё написать юнит-тесты, чтобы проверить/продумать поведение при переполнении и для отрицательных чисел.
Мне страшно ) Объясните откуда это ?
Re[2]: Определение ближайшего числа, делимого нацело на 4
Здравствуйте, Аноним, Вы писали:
А>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.
int a = 5;
int b = (a + 4-1) & ~(4-1);
Re[3]: Определение ближайшего числа, делимого нацело на 4
Здравствуйте, 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, Вы писали:
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
Здравствуйте, ilnar, Вы писали:
I>если не хардкодить константы вручную, и юнит тестов не надо)) I>b=(a + 4-1) & ~(4-1)
Угу, а потом будем удивляться, почему у нас при a близком к INT_MAX на выходе отрицательные числа вылезут
Зависит, конечно, от приложения, но, к примеру, на старой работе (финансовые модули) такую халяву на испекции бы точно зарубили, кому нужны иски на 4 миллиарда у.е.?
Re[6]: Определение ближайшего числа, делимого нацело на 4
Здравствуйте, andy1618, Вы писали:
A>Здравствуйте, ilnar, Вы писали:
I>>если не хардкодить константы вручную, и юнит тестов не надо)) I>>b=(a + 4-1) & ~(4-1)
A>Угу, а потом будем удивляться, почему у нас при a близком к INT_MAX на выходе отрицательные числа вылезут A>Зависит, конечно, от приложения, но, к примеру, на старой работе (финансовые модули) такую халяву на испекции бы точно зарубили, кому нужны иски на 4 миллиарда у.е.?
разве там не свои типы для счета денег, включающие разные алгоритмы округления?
Re[7]: Определение ближайшего числа, делимого нацело на 4
Здравствуйте, ilnar, Вы писали:
I>>>если не хардкодить константы вручную, и юнит тестов не надо)) I>>>b=(a + 4-1) & ~(4-1)
A>>Угу, а потом будем удивляться, почему у нас при a близком к INT_MAX на выходе отрицательные числа вылезут A>>Зависит, конечно, от приложения, но, к примеру, на старой работе (финансовые модули) такую халяву на испекции бы точно зарубили, кому нужны иски на 4 миллиарда у.е.?
I>разве там не свои типы для счета денег, включающие разные алгоритмы округления?
Конечно, там всё, что связано с активами, считалось предельно аккуратно. Но и в других модулях отношение к потенциальным "спецэффектам" (переполнения, ошибки off-by-one и т.п.) было серьёзное, т.к. код проходил по классу риска "невосполнимые финансовые потери".
Re: Определение ближайшего числа, делимого нацело на 4
Здравствуйте, Аноним, Вы писали:
А>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.
a/4*4+4
вместо того чтобы маяться хернёй с bit fiddling and unit tests around it
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: Определение ближайшего числа, делимого нацело на 4
Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, Аноним, Вы писали:
А>>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4.
BZ>a/4*4+4
BZ>вместо того чтобы маяться хернёй с bit fiddling and unit tests around it
это смотря сколько раз этот код выполняться будет
Re[3]: Определение ближайшего числа, делимого нацело на 4
Здравствуйте, ilnar, Вы писали:
BZ>>a/4*4+4
BZ>>вместо того чтобы маяться хернёй с bit fiddling and unit tests around it
I>это смотря сколько раз этот код выполняться будет
даже я, человек написавший самый быстрый архиватор в мире, в 99% случаев пишу код который не нуждается в оптимизации. сомневаюсь, что у вас, а тем более студента задавшего вопрос, этот показатель больше. а весь выигрыш тут, страшно сказать, в одной ар. операции, и то если ступит компилятор. скорее всё же дело в вашем желании выпендриться, продемонстрировать что вы знаете такие хитрые способы, даром что это приведёт к тому что над задачей вы продумали вдесятеро дольше плюс ещё понадобилось писать юнит-тесты чтоб найти ошибку
Здравствуйте, 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
Здравствуйте, rg45, Вы писали:
А>>>Простой вопрос: Дано число А, которое не делится нацело на 4. Необходимо определить ближайшее числу А число В (В > А), которое будет делиться нацело на 4. BZ>>a/4*4+4 BZ>>вместо того чтобы маяться хернёй с bit fiddling and unit tests around it R>Херней, говоришь? А проверь-ка свое решение для a = 4, получается 8.
И?
R>А теперь давай исправим ошибку, да не забудем про отрицательную область определения:
Какую ошибку-то? Условие не читали, что ли?
Кстати, это третье или второе сообщение? Или даже четвертое?
Еще один раз переотвечать не буду, а для "Мусора" у меня прав нет.