- 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
SemaReal 04.03.2018 01:41 # +3
3.14159265 05.03.2018 15:46 # 0
Просто разбили 64-битное деление на 2 32-битных.
>a = div10((unsigned int)(v >> 32));
>b = div10((unsigned int)(v & 0xffffffff));
Дистрибутивность для пятиклассников.
(hi+lo)/10 = hi/10+lo/10;
Вот интересенее div10 посмотреть. Там наверняка умножение на "магию".
inho 04.03.2018 12:50 # +1
j123123 04.03.2018 13:04 # +2
И да этот __udivdi3 является более общим случаем(т.е. делить можно не только на 10, а на любую фигню), а в этом говнокоде особая заточенная реализация для деления именно на 10
g0_1494034731324 04.03.2018 14:21 # −1
Меня шмонай ты, вертухай,
Да загляни под юбочку,
Да посмотри на булочки.
Понюхай попку носиком,
Прикинься, киса, пёсиком,
Вот в этом вся и разница,
Кто хочет, а кто дразнится.
©Любимая группа мамки админа
shit_again 21.05.2018 08:13 # 0
3.14159265 05.03.2018 15:54 # +1
Там деления вообще нет.
Но тут дело в том что gcc/clang давным-давно научились вычислять "магические числа" при компиляции, и заменять деление на умножение + сдвиг.
Даже жабовский hotspot лет 5 назад научился оптимизировать деление на константы. Потому непонятно зачем писать весь этот код.
3.14159265 05.03.2018 15:58 # +1
https://godbolt.org/g/ddmtnj
Получаю imul (безо всяких флагов O2,O3):
"Умный" код с гитхаба.
0x66666667*2 = 0xccccccce
3.14159265 05.03.2018 16:12 # +3
Тогда нормально.
> 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.
Steve_Brown 05.03.2018 17:02 # 0
bormand 05.03.2018 17:23 # 0
Джава вон про целый СтроительСтрок знает когда плюсик конпелит...
3.14159265 06.03.2018 00:14 # +1
Использование "+" для конкатенации уже обсуждали. Уж лучше бы оставили конкатенацию м-м-максимально неудобной, а развивали либу, в тех местах где плюсики помогали быстро говнячить: sql, html, логгирование, формат-стринги.
Глядишь и говна меньше было бы: меньше бы клеили sqlи, а больше юзали prepared statement.
Меньше бы лепили тормозное логирование,
А больше юзали форматтеры:
Итд.
SemaReal 06.03.2018 00:42 # 0
Перегрузка туда же относится.
Всё потому что 25 лет назад кто-то сказал "кококок, перегрузка усложняет код"
3.14159265 06.03.2018 02:56 # 0
Есть, причём довольно приличный. Лучше чем в C#.
> в генерецию аксесоров/мутаторов
>датаклассы
SemaReal 06.03.2018 03:39 # 0
Вывода типов нет. Напиши мне дефиницию переменной типа стринг, и сам увидишь
3.14159265 06.03.2018 03:46 # +1
Это не очередная аоп-магия. К аоп вообще никакого отношения.
Это часть языка. Подключаешь обычный jar (пару строк в мавене) и готово!
@Getter @Setter превращаются генерециями в обычные методы.
SemaReal 06.03.2018 03:47 # 0
Зы
Генереции это такие вореции?
3.14159265 06.03.2018 03:52 # 0
В стандартной либе сделаны кодогенереции javax.annotation.processing.Processor
Они позволяют расширять язык такими штуковинами. Без изменения формата байт-кода и самого языка.
>Напиши мне дефиницию переменной типа стринг, и сам увидишь
String s="haha";
SemaReal 06.03.2018 03:53 # 0
3.14159265 06.03.2018 04:03 # 0
Фу, тот же jvm.
Уж лучше в чистую яву аннотации добавлять, чем весь проект переписывать.
Да и профита там особо нет. Уж лучше на скалу пересесть, если ява не нравится.
SemaReal 06.03.2018 04:12 # 0
data class Foo(name:String)
val foo = Foo("ddd")
print(foo.name)
3.14159265 06.03.2018 04:16 # +2
А с lombok это по-прежнему обычная ява, я в любой момент могу обратно сгенерить бойлеплейтный java-код, распидорасив аннотации.
SemaReal 06.03.2018 04:39 # 0
SemaReal 06.03.2018 03:59 # 0
Вот вывод
var foo=12
val k = arrayOf(12,222)
3.14159265 06.03.2018 04:11 # +1
Кмк эта говнофича обычно только убивает читабельность кода.
Ну если сильно хочется, то можно.
>val k = arrayOf(12,222)
Тем более фича неконсистентна return type в методе не выводит. Толк?
SemaReal 06.03.2018 04:13 # 0
fun foo()=123
Не знаю, мне нравится
Все лучше чем писать два раза тип
3.14159265 06.03.2018 04:18 # 0
В яве (если не используешь lombok.val) ты пишешь тип 1 (один) раз
val полезен только в случае паровозов из генериков: AbstractMap<Sting,List<Integer>>
>fun foo()=123
Что за язык?
SemaReal 06.03.2018 04:37 # 0
Язык котлин
fun foo(bar:Integer)=bar +42
val buz=listOf(foo(12), 100050)
buz теперь лист интов
SemaReal 06.03.2018 04:48 # +2
А не говно есть сами знаете в каких япах уже 50 лет как
NrOPb_rAHDOHOB 04.03.2018 22:14 # 0
shit_again 21.05.2018 08:14 # 0
shit_again 21.05.2018 08:15 # 0
NrOPb_rAHDOHOB 04.03.2018 22:14 # 0
NrOPb_rAHDOHOB 04.03.2018 22:14 # 0
NrOPb_rAHDOHOB 04.03.2018 22:14 # 0
NrOPb_rAHDOHOB 04.03.2018 22:14 # 0
g0_1494034731324 05.03.2018 05:18 # 0
g0_1494034731324 05.03.2018 05:18 # 0
g0_1494034731324 05.03.2018 05:19 # 0
doctor_stertor 05.03.2018 13:19 # 0
bormand 05.03.2018 13:20 # 0
doctor_stertor 05.03.2018 13:22 # 0
shit_again 21.05.2018 08:16 # 0
shit_again 21.05.2018 08:16 # 0
vistefan 05.03.2018 13:23 # 0
vvkir 05.03.2018 15:17 # 0
3.14159265 05.03.2018 15:37 # +1
Я засираю: ну нормально, знай поехали там, вся ворецировать, может с кем-нибудь организационным познакомлюсь там, нормально всё будет.
shit_again 21.05.2018 08:17 # 0
guest8 21.05.2018 14:06 # −999
hellow 21.05.2018 23:16 # 0
3.14159265 05.03.2018 15:42 # +2
/* one dream */
/* one soul */
/* one prize */
/* one goal */
По-моему эта песня отсылка к другой песне: Ein Volk, Ein Reich, Ein Führer
Steve_Brown 05.03.2018 17:04 # 0
int o;