- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
#include <stdio.h>
void swap(long *a,long *b){
*a=(*a<<sizeof(*a)*4);
*a+=*b;
*b=*a ^ *b;
*b=(*b>>sizeof(*a)*4);
*a=(*a<<sizeof(*a)*4);
*a=(*a>>sizeof(*a)*4);
}
int main(){
long a=22807;
long b=1012;
printf("a=%ld b=%ld\n",a,b);
swap(&a,&b);
printf("a=%ld b=%ld\n",a,b);
}
bormand 29.09.2012 20:52 # +7
FAIL. (т.к. нормально обменивает только числа в половину разрядности long'а).
P.S. Но реализация понравилась, такого извращения для обмена переменных я еще не видел, поэтому ловите плюс.
myaut 30.09.2012 15:28 # 0
> long b=1012;
Автора сгубило неумение писать юнит-тесты
bormand 30.09.2012 16:08 # +5
Что вы, это наоборот умение "как составить тесты для неработоспособной программы, чтобы сдать ее неопытному заказчику".
AliceGoth 30.09.2012 21:54 # −3
long long int a=-41000L;
long long int b=-5305L;
for(long i=0;i<=1000000L;i++){
printf("before a=%lld b=%lld\n",a,b);
swap(&a,&b);
printf("after a=%lld b=%lld\n",a,b);
swap(&a,&b);
printf("a=%ld b=%ld\n",a,b);
a++;b++;
}
bormand 01.10.2012 05:32 # +1
Тогда, чтобы быть честным, запилите цикл до 4000000000 (можно с большим шагом). Баг с потерей старших разрядов один хрен не устранен.
> printf("after a=%lld b=%lld\n",a,b);
Юнит-тест не должен лишний раз показывать промежуточные результаты (разве что если найдет ошибку), а должен показывать результат теста - успех или ошибку. К примеру:
AliceGoth 29.09.2012 21:44 # −2
более правильно
#include <stdio.h>
void swap(int *a,int *b){
if(*a<0 & *b<0){
*a*=-1;*b*=-1;
*a=(*a<<sizeof(*a)*4);
*a+=*b;
*b=*a ^ *b;
*b=(*b>>sizeof(*a)*4);
*a=(*a<<sizeof(*a)*4);
*a=(*a>>sizeof(*a)*4);
*a*=-1;*b*=-1;
} else if(*a<0){
*a*=-1;
*a=(*a<<sizeof(*a)*4);
*a+=*b;
*b=*a ^ *b;
*b=(*b>>sizeof(*a)*4);
*a=(*a<<sizeof(*a)*4);
*a=(*a>>sizeof(*a)*4);
*b*=-1;
} else if(*b<0){
*b*=-1;
*a=(*a<<sizeof(*a)*4);
*a+=*b;
*b=*a ^ *b;
*b=(*b>>sizeof(*a)*4);
*a=(*a<<sizeof(*a)*4);
*a=(*a>>sizeof(*a)*4);
*a*=-1;
} else {
*a=(*a<<sizeof(*a)*4);
*a+=*b;
*b=*a ^ *b;
*b=(*b>>sizeof(*a)*4);
*a=(*a<<sizeof(*a)*4);
*a=(*a>>sizeof(*a)*4);
}
}
bormand 29.09.2012 22:15 # +4
Да тут не только знак, тут в строке 4 половина разрядов числа a втопку уходит: *a=(*a<<sizeof(*a)*4). Новый вариант в этом плане ничуть не лучше.
> *a*=-1
Красота ;)
AliceGoth 29.09.2012 22:41 # 0
Fai 30.09.2012 00:51 # +3
bormand 30.09.2012 07:12 # +4
LispGovno 30.09.2012 10:35 # +1
error: duplicate ‘short’
bormand 30.09.2012 07:10 # +5
TarasB 30.09.2012 16:14 # +6
Abbath 01.10.2012 15:01 # +4
3.14159265 01.10.2012 15:23 # +2
Рекомендую сравнить по количеству действий с тем как пишут "тупые", неилитарные кодеры.
bormand 01.10.2012 16:11 # +2
А "умные" неилитарные кодеры пишут swap(a, b)
LispGovno 01.10.2012 22:03 # +2
bormand 01.10.2012 22:04 # 0
Что-то запамятовал, это какой язык?
roman-kashitsyn 01.10.2012 22:05 # +3
LispGovno 01.10.2012 22:17 # 0
TarasB 02.10.2012 09:57 # +1
Чувак показал пример сортировки пузырьком на своём языке:
правда неоднозначность семантики выяснилась слишком быстро.
LispGovno 02.10.2012 10:50 # 0
http://ideone.com/jJswF
TarasB 01.10.2012 16:12 # +5
LispGovno 01.10.2012 22:06 # 0
absolut 02.10.2012 09:05 # +2
а с auto тоже смысл изменился из C++0x.
LispGovno 02.10.2012 10:45 # 0
Если вы не заметили, то этот новый смысл как раз применяется.
>на register компилятор, насколько я помню, давно уже плюет с высокой колокольни.
Эх, надо было мне код зеленым оборачивать.
LispGovno 02.10.2012 17:00 # 0
http://ideone.com/DzIRA
absolut 02.10.2012 17:36 # 0
3.14159265 01.10.2012 15:16 # +2
Даже в былые времена когда регистров было мало, это считалось сомнительным ибо существовал XCHG.
bormand 01.10.2012 16:10 # 0
Это же просто головоломка. Зачем к ней так серьезно подходить?
P.S. То что говно - да. И к тому же (по крайней мере на x86) компилятор запилит временную переменную в регистре (если сами a и b не в регистрах), т.к. на x86 нельзя выполнять операции над двумя областями памяти одной командой.
TarasB 01.10.2012 16:13 # +2
А если они в регистрах, то обмен скорее всего будет в 3 действия через третий регистр.
bormand 01.10.2012 16:15 # 0
eth0 30.09.2012 08:19 # +1
Vindicar 30.09.2012 12:47 # +2
LispGovno 30.09.2012 14:05 # +3
LispGovno 01.10.2012 22:24 # 0
guest 02.10.2012 08:55 # +1