- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
// https://github.com/Samsung/ADBI/blob/3e424c45386b0a36c57211da819021cb1929775a/idk/include/division.h#L138
/* Long division by 10. */
static unsigned long long int div10l(unsigned long long int v) {
/* It's a kind of magic. We achieve 64-bit (long) division by dividing the two 32-bit halfs of the number 64-bit
* number. The first (most significant) half can produce a rest when dividing, which has to be carried over to the
* second half. The rest_add table contains values added to the second half after dividing depending on the rest
* from the first division. This allows evaluation of a result which is almost correct -- it can be either the
* expected result, or the expected result plus one. The error can be easily detected and corrected.
*/
/* one dream */
static unsigned long long int rest_add[] = {
0x00000000, 0x1999999a, 0x33333334, 0x4ccccccd, 0x66666667,
0x80000001, 0x9999999a, 0xb3333334, 0xcccccccd, 0xe6666667
};
/* one soul */
unsigned long long int a = div10((unsigned int)(v >> 32));
unsigned long long int b = div10((unsigned int)(v & 0xffffffff));
/* one prize */
int ri = (v >> 32) - a * 10;
/* one goal */
unsigned long long int ret = (a << 32) + b + rest_add[ri];
/* one golden glance */
if (ret * 10L > v) {
//printf("OGG %llu %llu\n", ret * 10, v);
--ret;
}
/* of what should be */
return ret;
}
Деление на 10. Но зачем? Неужели компилятор настолько туп, что сам не может этого сделать?
И да, эти туповатые комментарии one dream, one soul это отсылка к песне Queen - A Kind of Magic https://youtu.be/0p_1QSUsbsM
Просто разбили 64-битное деление на 2 32-битных.
>a = div10((unsigned int)(v >> 32));
>b = div10((unsigned int)(v & 0xffffffff));
Дистрибутивность для пятиклассников.
(hi+lo)/10 = hi/10+lo/10;
Вот интересенее div10 посмотреть. Там наверняка умножение на "магию".
И да этот __udivdi3 является более общим случаем(т.е. делить можно не только на 10, а на любую фигню), а в этом говнокоде особая заточенная реализация для деления именно на 10
Меня шмонай ты, вертухай,
Да загляни под юбочку,
Да посмотри на булочки.
Понюхай попку носиком,
Прикинься, киса, пёсиком,
Вот в этом вся и разница,
Кто хочет, а кто дразнится.
©Любимая группа мамки админа
Там деления вообще нет.
Но тут дело в том что gcc/clang давным-давно научились вычислять "магические числа" при компиляции, и заменять деление на умножение + сдвиг.
Даже жабовский hotspot лет 5 назад научился оптимизировать деление на константы. Потому непонятно зачем писать весь этот код.
https://godbolt.org/g/ddmtnj
Получаю imul (безо всяких флагов O2,O3):
"Умный" код с гитхаба.
0x66666667*2 = 0xccccccce
Тогда нормально.
> Normally, the GCC compiler handles this problem.
> Whenever a division operation is required, GCC inserts a call to a function, which replaces the division operation. This and other helper functions are implemented in libgcc, a library (usually static) distributed together with GCC. The compiler and linker take care about linking with this file automatically.
>This library should even be included in the library when linking with the -nostdlib and similar switches. (However, this depends on the configuration.)
>The libgcc library has its own dependencies as well, which we can not supply. For this reason, we need our own division algorithms.
Джава вон про целый СтроительСтрок знает когда плюсик конпелит...
Использование "+" для конкатенации уже обсуждали. Уж лучше бы оставили конкатенацию м-м-максимально неудобной, а развивали либу, в тех местах где плюсики помогали быстро говнячить: sql, html, логгирование, формат-стринги.
Глядишь и говна меньше было бы: меньше бы клеили sqlи, а больше юзали prepared statement.
Меньше бы лепили тормозное логирование,
А больше юзали форматтеры:
Итд.
Перегрузка туда же относится.
Всё потому что 25 лет назад кто-то сказал "кококок, перегрузка усложняет код"
Есть, причём довольно приличный. Лучше чем в C#.
> в генерецию аксесоров/мутаторов
>датаклассы
Вывода типов нет. Напиши мне дефиницию переменной типа стринг, и сам увидишь
Это не очередная аоп-магия. К аоп вообще никакого отношения.
Это часть языка. Подключаешь обычный jar (пару строк в мавене) и готово!
@Getter @Setter превращаются генерециями в обычные методы.
Зы
Генереции это такие вореции?
В стандартной либе сделаны кодогенереции javax.annotation.processing.Processor
Они позволяют расширять язык такими штуковинами. Без изменения формата байт-кода и самого языка.
>Напиши мне дефиницию переменной типа стринг, и сам увидишь
String s="haha";
Фу, тот же jvm.
Уж лучше в чистую яву аннотации добавлять, чем весь проект переписывать.
Да и профита там особо нет. Уж лучше на скалу пересесть, если ява не нравится.
data class Foo(name:String)
val foo = Foo("ddd")
print(foo.name)
А с lombok это по-прежнему обычная ява, я в любой момент могу обратно сгенерить бойлеплейтный java-код, распидорасив аннотации.
Вот вывод
var foo=12
val k = arrayOf(12,222)
Кмк эта говнофича обычно только убивает читабельность кода.
Ну если сильно хочется, то можно.
>val k = arrayOf(12,222)
Тем более фича неконсистентна return type в методе не выводит. Толк?
fun foo()=123
Не знаю, мне нравится
Все лучше чем писать два раза тип
В яве (если не используешь lombok.val) ты пишешь тип 1 (один) раз
val полезен только в случае паровозов из генериков: AbstractMap<Sting,List<Integer>>
>fun foo()=123
Что за язык?
Язык котлин
fun foo(bar:Integer)=bar +42
val buz=listOf(foo(12), 100050)
buz теперь лист интов
А не говно есть сами знаете в каких япах уже 50 лет как
Я засираю: ну нормально, знай поехали там, вся ворецировать, может с кем-нибудь организационным познакомлюсь там, нормально всё будет.
/* one dream */
/* one soul */
/* one prize */
/* one goal */
По-моему эта песня отсылка к другой песне: Ein Volk, Ein Reich, Ein Führer
int o;