|
Как посчитать количество бит в байте? | ☑ | ||
---|---|---|---|---|
0
vogenut
10.12.09
✎
10:33
|
Есть число от 0 до 255. Соответственно влезает в один байт. Надо узнать сколько в нем выставлено битов. Мысли есть?
|
|||
1
Гефест
10.12.09
✎
10:34
|
8???
|
|||
2
palpetrovich
10.12.09
✎
10:34
|
8
|
|||
3
Господин ПЖ
10.12.09
✎
10:35
|
преобразовать в двоичное и посчитать "1"?
|
|||
4
Salvador Limones
10.12.09
✎
10:35
|
По високосным и до 9 доходит.
|
|||
5
vogenut
10.12.09
✎
10:35
|
(1) Да нет. Есть определенное значение байта, надо узнать сколько бит для данного байта установлено.
|
|||
6
palpetrovich
10.12.09
✎
10:36
|
(4) ну эт редко
|
|||
7
vogenut
10.12.09
✎
10:36
|
(3) А как в двоичное преобразовать?
|
|||
8
palpetrovich
10.12.09
✎
10:36
|
(5) задай вопрос по-другому
|
|||
9
asp
10.12.09
✎
10:37
|
(5) где установлено?
|
|||
10
Гефест
10.12.09
✎
10:37
|
телепатирую, что нужно посчитать количество одоек в строке типа "01100100"
|
|||
11
vogenut
10.12.09
✎
10:38
|
(8) Возьмем число 1. Это в двоичном представлении 1, т.е. выставлен один бит. Число 2 в двоичном представлении равно 10, тоже один бит выставленным получается.
|
|||
12
Господин ПЖ
10.12.09
✎
10:38
|
(7) функцией...
|
|||
13
palpetrovich
10.12.09
✎
10:38
|
дес - дв
0 - 00 1 - 01 2 - 10 3 - 11 4 - 100 ... |
|||
14
Ненавижу 1С
гуру
10.12.09
✎
10:38
|
(5) сколько единичных (ненулевых) бит в нем?
|
|||
15
vogenut
10.12.09
✎
10:39
|
(10) У меня на входе Число на входе, а не строка
|
|||
16
vogenut
10.12.09
✎
10:39
|
(14) Угу
|
|||
17
vogenut
10.12.09
✎
10:40
|
(12) Понятно ) Но мне алгоритм интересен
|
|||
18
vogenut
10.12.09
✎
10:41
|
Забыл сказать. Это должно работать быстро, т.к. такая функция будет вызываться очень много раз.
|
|||
19
vogenut
10.12.09
✎
10:43
|
Блин, почему в 1С нету битовых операций? (
|
|||
20
shuhard
10.12.09
✎
10:43
|
(18) кури XOR в Math
Перем Массив[256]; Функция Сдвиг(а,н,куда) Перем Ат; Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl"); Скрипт.language="javascript"; Математика=Скрипт.Eval("Math"); Если а=0 Тогда Возврат 0; Иначе Ат=Математика.pow(2,Цел(Лог(а)/Лог(2)))+1 КонецЕсли; Если Ат<65535 Тогда Ат=65535; КонецЕсли; Если куда=1 Тогда Возврат а/Математика.pow(2,н); Иначе Возврат а*Математика.pow(2,н)%Ат; КонецЕсли; КонецФункции Функция Расчет(Знач НачСумма,Сп) Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl"); Скрипт.language="vbscript"; Для к=1 По Сп.РазмерСписка() Цикл НачСумма=Массив[Скрипт.Eval("("+Сдвиг(НачСумма,8,1) +" AND 255) XOR "+Сдвиг(НачСумма,8,0)+" XOR "+Сдвиг(НачСумма,8,0)+" XOR "+Сп.ПолучитьЗначение(к))+1]; НачСумма=Скрипт.Eval(НачСумма+" AND 65535"); КонецЦикла; Возврат НачСумма; КонецФункции |
|||
21
Snovy
10.12.09
✎
10:43
|
Когда то на ВБ упаковывал 16 флажков в одно число. Все было настолько просто... помню, что в 7.7 такого функционала не было, в 8 тоже не нашли и забросили это дело. Упаковка через исключающее "или" и распаковка через "и" битовых операциях (или наоборот)
|
|||
22
kitt
10.12.09
✎
10:45
|
(17)
Функция ДесВДвоич(ТекЧисло) Если ТекЧисло = 0 Тогда Возврат "0"; ИначеЕсли ТекЧисло = 1 Тогда Возврат "1"; ИначеЕсли ТекЧисло = 2 Тогда Возврат "10"; ИначеЕсли ТекЧисло = 3 Тогда Возврат "11"; ...ну ты понел )... и так далее КонецЕсли; КонецФункции |
|||
23
vogenut
10.12.09
✎
10:45
|
(20) Не вкурил. И как мне получить число битов для моего числа?
|
|||
24
vogenut
10.12.09
✎
10:46
|
(22) Мне не десятичное представление нужно, а количество единичек в числе
|
|||
25
Mikeware
10.12.09
✎
10:46
|
Единиц=0;
Для сч=1 По 8 Цикл Если Нечет(ВхЧисло)=1 Тогда Единиц=Единиц+1; КонецЕсли; ВхЧисло=Цел(ВхЧисло/2); КонецЦикла; |
|||
26
vogenut
10.12.09
✎
10:47
|
(24) Не бинарное представление, хотел сказать
|
|||
27
Mikeware
10.12.09
✎
10:47
|
(20) yahoo.eu
|
|||
28
vogenut
10.12.09
✎
10:48
|
(25) Уже вариант. Но кажется, что будет медленно, функция сто тыщ миллионов будет вызываться.
|
|||
29
БТР
10.12.09
✎
10:49
|
Хрень какая то. Бит это не только 1 но и 0. Всегда 8 бит.
|
|||
30
vde69
10.12.09
✎
10:49
|
8 раз дели на 2 и при этом считай сумму остатка от деления
|
|||
31
romix
10.12.09
✎
10:50
|
В 1С есть оператор % который дает остаток (хвостик) от деления.
Делить на два таким способом 8 раз и выводить на экран хвостик - получится двоичное число (начиная с младшей цифры). Тут можно и единицы посчитать, и само двоичное число получить. |
|||
32
Ненавижу 1С
гуру
10.12.09
✎
10:50
|
Единиц=0;
Пока ВчЧисло>0 Цикл Ост = ВчЧисло % 2; Единиц=Единиц+Ост; ВхЧисло=(ВхЧисло-Ост)/2; КонецЦикла; |
|||
33
Raybek
10.12.09
✎
10:50
|
(28) Если нужно быстрее...
Если числа только с 0 до 255, то запомни где-нибудь табличку соответствия Число-Кол-во 1. |
|||
34
vogenut
10.12.09
✎
10:51
|
(33) Отлично! То что доктор прописал! Спасибо! )
|
|||
35
Raybek
10.12.09
✎
10:52
|
То бишь у тебя получится таблица соответвия с колонками "Число" и "Количество единиц". Или еще лучше массив, где индекс элемента - это число, а значение массива - это кол-во единиц. Тогда тупо вызваешь Массив[15]:)
|
|||
36
shuhard
10.12.09
✎
10:53
|
(23) учи матчасть
|
|||
37
vogenut
10.12.09
✎
10:54
|
(35) Да, быстрее не придумаешь )
|
|||
38
palpetrovich
10.12.09
✎
10:54
|
(35) стопудов! а заполнять при начале работы с помощью (32)
|
|||
39
БТР
10.12.09
✎
10:54
|
(37) Открой военную тайну, зачем тебе это вообще надо?
|
|||
40
Mikeware
10.12.09
✎
10:56
|
(28)
мат=СоздатьОбъект("Математика"); Единиц=мат.bitand(арг,128)/128+мат.bitand(арг,64)/64+ мат.bitand(арг,32)/32+ мат.bitand(арг,16)/16+ мат.bitand(арг,8)/8+мат.bitand(арг,4)/4+мат.bitand(арг,2)/2+мат.bitand(арг,1); |
|||
41
Boroda
10.12.09
✎
10:57
|
Вот, писал для семерки.
Как разложить в двоичный код: Функция ВернутьДвКод(ч) х = Цел(ч/2); Если х>0 Тогда Возврат ВернутьДвКод(х)+Строка(ч-х*2); КонецЕсли; Возврат Строка(ч-х*2); КонецФункции //******************************************* Процедура Сформировать() рез = ВернутьДвКод(ВыбЧисло); Сообщить(рез); Сообщить(Прав(Рез,1)) ; КонецПроцедуры |
|||
42
vogenut
10.12.09
✎
10:58
|
(39) Есть одна специфическая задачка...
|
|||
43
Ненавижу 1С
гуру
10.12.09
✎
11:00
|
(42) которую конечно надо решить на 1Це
|
|||
44
vogenut
10.12.09
✎
11:01
|
(43) Ну, разные проблемы бывают. Приходится решать. В УПП вон системы линейных уравнений решают и ничего...
|
|||
45
Raybek
10.12.09
✎
11:03
|
(42) Блин, заинтриговал, раздраконил любопытство ...и свалил:)
|
|||
46
Ненавижу 1С
гуру
10.12.09
✎
11:03
|
(44) СЛУ еще понять можно и то я бы само решение вынес бы во внешнюю компоненту. Мне понятно зачем решать СЛУ в УПП, зачем битовые операции в учетных задачах - непонятно
|
|||
47
СоболиныйГлаз
10.12.09
✎
11:04
|
Тупо делить число на 128, остаток от деления на 64 и т.д. Результаты(целые, ес-но) сложить.
|
|||
48
БТР
10.12.09
✎
11:08
|
От одинэсники ушлые какие. В какой программе то? В бухгалтерии? На каком счету байты учитываете? Или к торговле партионный и складской учет байт налаживаешь?
|
|||
49
vde69
10.12.09
✎
11:12
|
(48) например права хранятся в байте и при устаноке надо контролировать, что нельзя более 5 галок одновременно ставить...
а вообще битовые операции в 1с - это нонсенс, так как в 1с НЕТУ битового типа, как и вообще числовового то-же нету (в нормальном понимании) |
|||
50
vogenut
10.12.09
✎
11:13
|
(45)(46)(48) Контроль четности например
|
|||
51
Mikeware
10.12.09
✎
11:15
|
(50) Для контроля четности достаточно контролировать один бит :-)
|
|||
52
DUDE
10.12.09
✎
11:17
|
(51) +1. Младший.
|
|||
53
DUDE
10.12.09
✎
11:18
|
Или последнюю цифру числа.
|
|||
54
БТР
10.12.09
✎
11:18
|
жеееесть...
(49) У тебя права в 1С в "байте" хранятся? Че курил то? |
|||
55
Mikeware
10.12.09
✎
11:20
|
(54) ПОчему бы и нет?
У меня правила миграции документа в двух байтах :-)) |
|||
56
Raybek
10.12.09
✎
11:21
|
(50) Контроль четности чего? Числа с 0 до 255? Тогда, если последнее число 0 или четное - тогда число четное. Только вот опять для чего?:) Еще и сто миллионов раз будет проверяться четность? Колитесь короче:)
|
|||
57
БТР
10.12.09
✎
11:23
|
(55) Тоже занимался подсчетом еденичек в двоичном предсавлении байта?
|
|||
58
Mikeware
10.12.09
✎
11:24
|
(57) "В отличие от" - я сначала думаю, а потом делаю... :-)
|
|||
59
Raybek
10.12.09
✎
11:25
|
(50) Ааааа, какой-то алгоритм связанный с шифровкой-дешифровкой... криптографией занимаемся в 1С?:)
|
|||
60
Mikeware
10.12.09
✎
11:26
|
(59) Ну необязательно криптографией - может, контролем данных...
|
|||
61
vde69
10.12.09
✎
11:27
|
(54) я где-то говорил про права 1с??????
я говорил просто про ПРАВА, которые могуб быть например переданы в ХП совершенно другой учетной системы (например интернет магазина). Я говорю, что ситуация возможна, но в рамках 1с абсурдна. зы всегда удивлялся как люди умеют искажать явно выраженое мнение... |
|||
62
vde69
10.12.09
✎
11:30
|
(59) у меня например есть такой код в моей программе
Знак = ""; Пока Знак <> Неопределено Цикл Знак = Текст.Прочитать(1); Если Знак <> Неопределено Тогда // декодируем символ Если е = 36 Тогда е = 1; Иначе е = е + 1; КонецЕсли; ЗнакКлюча = КодСимвола(ВолшебныйКлюч, е); Знак = КодСимвола(Знак); // надо сделать следующую операцию // Знак = Знак XOR ЗнакКлюча РезЗнак = 0; Для е1 = 1 по 8 Цикл ИтоговыйБит = 1; Маска=Pow(2, е1-1); Бит1=Цел(Знак / Маска); Бит2=Цел(ЗнакКлюча / Маска); Если ((Бит1+Бит2)/2)=Окр((Бит1+Бит2)/2,0) Тогда ИтоговыйБит = 0; КонецЕсли; РезЗнак = РезЗнак + Маска * ИтоговыйБит; КонецЦикла; // все, теперь добавим к уже расшифрованной строке СтрокаФайла = СтрокаФайла + Символ(РезЗнак); КонецЕсли; КонецЦикла; |
|||
63
БТР
10.12.09
✎
11:31
|
(61) Да, лан, че ты завелся :-)
(0) Ну, давай, колись быстро, что ваяешь :-))) |
|||
64
devlabnn
10.12.09
✎
11:37
|
(0)
КолБит = 0; Пока Байт > 0 Цикл КолБит = КолБит + Байт % 2; Байт = Цел(Байт/2); КонецЦИкла; хе |
|||
65
vogenut
10.12.09
✎
11:50
|
(64) Уже нашли самый простой и самый быстрый вариант )
|
|||
66
vogenut
10.12.09
✎
11:50
|
(63) Сие тайна есть великая )
|
|||
67
vogenut
10.12.09
✎
11:51
|
(59) Тепло... )
|
|||
68
Cap_1977
10.12.09
✎
11:53
|
(65) Пример приведи
|
|||
69
fisher
10.12.09
✎
11:54
|
(65) Ну а этим будешь инициализировать свою табличку.
|
|||
70
vogenut
10.12.09
✎
11:57
|
(68)
Перем БитыВБайте; Функция КоличествоБит(Число) Возврат БитыВБайте[Число]; КонецФункции БитыВБайте[0] = 0; БитыВБайте[1] = 1; БитыВБайте[2] = 1; БитыВБайте[3] = 2; ... БитыВБайте[255] = 8; |
|||
71
fisher
10.12.09
✎
11:58
|
(64) Вариант в (32) симпатичней.
|
|||
72
Cap_1977
10.12.09
✎
12:00
|
(70) Жесть
|
|||
73
vogenut
10.12.09
✎
12:01
|
(72) То, что доктор прописал )
|
|||
74
fisher
10.12.09
✎
12:01
|
(72) Есть варианты быстрее?
|
|||
75
vogenut
10.12.09
✎
12:02
|
(74) И проще )))
|
|||
76
supremum
10.12.09
✎
12:02
|
(74) На ассемблере
|
|||
77
БТР
10.12.09
✎
12:03
|
Поставьте плиз категорию "Юмор" ветке.
|
|||
78
vogenut
10.12.09
✎
12:03
|
(76) Эта реализация похоже для любых языков самая быстрая
|
|||
79
Cap_1977
10.12.09
✎
12:03
|
(73) Идея праильная ))) Только массив инициализируй перед вызовом своего криптоапи
|
|||
80
Cap_1977
10.12.09
✎
12:04
|
(79) + в цикле
|
|||
81
vogenut
10.12.09
✎
12:05
|
(73) Массив при загрузке модуля будет инициализироваться
|
|||
82
Cap_1977
10.12.09
✎
12:05
|
(81) Т.е. ты всерьез будешь набивать 255 строк теста ? а если ошибешься где нить ?
|
|||
83
supremum
10.12.09
✎
12:07
|
(82) сгенерировать в екселе и поставить в 1с
|
|||
84
supremum
10.12.09
✎
12:08
|
(82) и не 255 строк, а 256 строк
|
|||
85
Mikeware
10.12.09
✎
12:09
|
(84) И на "0" - тоже? :-)
|
|||
86
Мутабор
10.12.09
✎
12:11
|
1 - 1 бит в конце
2 - 2 бит 4 - 3 бит 8 - 4 бит 16 - 5 бит 32 - 6 бит 64 - 7 бит 128 - 8 бит разбивай число на составляющие.. >=128 - 8-й бит установлен число-128>=64 7-й бит установлен и т.д. |
|||
87
devlabnn
10.12.09
✎
12:12
|
(86) что это?
|
|||
88
hhhh
10.12.09
✎
12:13
|
(86) тормозной вариант, уже ведь обсудили.
|
|||
89
Мутабор
10.12.09
✎
12:13
|
(87) Чило назови от 0 до 255
|
|||
90
devlabnn
10.12.09
✎
12:13
|
(89) 0
|
|||
91
vde69
10.12.09
✎
12:14
|
Самый быстрый будет вот этот вариант:
Результат = 0; е = 0; Пока е <= 8 Цикл е = е + 1; Если Значение > СписокЗначений[е] Тогда Результат = Результат+1; е = е + 1; если е>8 тогда прервать конецесли; ИначеЕсли Значение > СписокЗначений[е] Тогда Результат = Результат+1; е = е + 1; если е>8 тогда прервать конецесли; ИначеЕсли Значение > СписокЗначений[е] Тогда Результат = Результат+1; е = е + 1; если е>8 тогда прервать конецесли; ....... КонецЕсли; КонецЦикла; список имеет значения 128,64,32 .... Операции сравнения всегда работают быстрее арифметических |
|||
92
Мутабор
10.12.09
✎
12:15
|
>128 0
>64 0 >32 0 >16 0 >8 0 >4 0 >2 0 >1 0 |
|||
93
vde69
10.12.09
✎
12:16
|
(91)+ есть ошибка, но где-то в этом направлении
|
|||
94
vogenut
10.12.09
✎
12:16
|
(81) Один раз написать массив не проблема
|
|||
95
fisher
10.12.09
✎
12:18
|
(86), (91) - это нерабочие варианты
|
|||
96
Мутабор
10.12.09
✎
12:19
|
(95) ты проверь
|
|||
97
Mikeware
10.12.09
✎
12:19
|
(93) Самым быстрым будет
Если Арг=0 тогда 0 иначе БитВБайте[Арг] |
|||
98
vogenut
10.12.09
✎
12:20
|
(91) Быстрее чем "Возврат БитыВБайте[Число]"? ;)
|
|||
99
vde69
10.12.09
✎
12:20
|
(95) Вот рабочий
Результат = 0; е = 0; Пока е <= 8 Цикл е = е + 1; Если Значение > СписокЗначений[е] Тогда Результат = Результат+1; Значение = Значение - СписокЗначений[е]; КонецЕсли; КонецЦикла; |
|||
100
Мутабор
10.12.09
✎
12:21
|
+(96) короче лень спорить, хошь проверяй, хошь нет.
|
|||
101
vogenut
10.12.09
✎
12:21
|
(97) А как оператор Если ускорит эту конструкцию?
|
|||
102
Mikeware
10.12.09
✎
12:24
|
(101) Он не ускорит. Он защитит от нулевого индекса
|
|||
103
fisher
10.12.09
✎
12:26
|
(100) Работать не будет.
"короче лень спорить, хошь проверяй, хошь нет" (с) |
|||
104
fisher
10.12.09
✎
12:31
|
(99) Да. Такой, по идее, рабочий. Но тут уже есть арифметические операции :) Плюс алгоритм не универсальный. Короче, нечто среднее по производительности и универсальности получается.
|
|||
105
vogenut
10.12.09
✎
12:31
|
(102) Дык, у массива индексация с 0
|
|||
106
Mikeware
10.12.09
✎
12:35
|
(105) в 1c - с нуля? Не знал... ЖКК глянуть надо... Но ленб
|
|||
107
vogenut
10.12.09
✎
12:35
|
(77) А причем здесь "Юмор"? ) Тема то серьезная
|
|||
108
vogenut
10.12.09
✎
12:36
|
(106) Массив (Array) Возможно обращение к значению элемента посредством оператора [...]. В качестве аргумента передается индекс значения (нумерация с 0).
|
|||
109
Ваше благородие
10.12.09
✎
12:36
|
В одном байте восемь бит.
|
|||
110
vogenut
10.12.09
✎
12:37
|
(109) Спасибо за информацию! ))
|
|||
111
Mikeware
10.12.09
✎
12:37
|
(109) А восемь ваххабитов - это один ваххабайт...
1 терапевт - 1024 гигапевта... |
|||
112
fisher
10.12.09
✎
12:38
|
Мне, я уже говорил, больше всего алгоритм из (32) импонирует. Простой, работает для любого числа, время выполнения пропорционально величине числа. Время выполнения практически не медленнее остальных вариантов (у 1С разницы по времени между элементарными операциями почти нет - её съедают накладные расходы интерпретации). Если время критично - тогда уже табличка. Компромиссы бессмысленны.
|
|||
113
vogenut
10.12.09
✎
12:38
|
В общем, даже такой высокоуровневый язык как 1С не помеха для работы с чем угодно и к тому же с приемлемой производительностью. Все дело в голове )
|
|||
114
pectopatop
10.12.09
✎
12:48
|
(113) ASM по-любэ быстрее будет. Хотя бы потому что компилятор
|
|||
115
pectopatop
10.12.09
✎
12:50
|
А извращятся конечно по-разному можно
|
|||
116
supremum
10.12.09
✎
12:52
|
+(114) ну и естественней делать по циклу, правый или левый сдвиг через флаг переноса, или через массив, но сказать что будет быстрее сможет только замер, причем на разных процессорах будет по разному
|
|||
117
fisher
10.12.09
✎
12:57
|
(116) Ты что? Через массив без вариантов быстрее. На каких процессорах не сравнивай.
|
|||
118
supremum
10.12.09
✎
13:06
|
(117) спекулятивное выполнение может проканать и будет быстрее, а с доступом в массив возникнут сложности: будет ли он в кеше ну и т. д.
|
|||
119
vogenut
10.12.09
✎
13:08
|
(113) Никто и не спорит. Но за глаза хватит и реализации на 1С
|
|||
120
5 Элемент
10.12.09
✎
13:10
|
Ужас
|
|||
121
vogenut
10.12.09
✎
13:13
|
(118) Ну такие функции используются обычно в циклах да еще к тому же в совокупности с другими вычислениями. Так что кеш будет валиден после первой итерации и эффект от спекуляции доступа к памяти с остальными операциями в совокупности выше чем сдвиг по циклу, даже развернутый.
|
|||
122
supremum
10.12.09
✎
13:16
|
(121) Сложно скзать нужно мерить. Наверное тут все таки может быть пороговое значение от количества вызовов подсчета битов, когда будет быстрее тот или другой вариант. Но без замеров сказать сложно.
|
|||
123
Tashiro
10.12.09
✎
13:22
|
СтрЧислоВхождений(Строка(Число), "1") не?
|
|||
124
supremum
10.12.09
✎
13:26
|
(123) Не! :)
|
|||
125
Tashiro
10.12.09
✎
13:32
|
(124) а в чем сакральность сделать это именно с числом? )
|
|||
126
supremum
10.12.09
✎
13:40
|
Сколько установленных битов в числе "112"? 2? На самом деле 3.
|
|||
127
GedKo
10.12.09
✎
13:42
|
(126) не факт =)
|
|||
128
ado
10.12.09
✎
13:49
|
(17) Мда ... а в школе на информатике теперь ворд изучают ...
|
|||
129
vogenut
10.12.09
✎
14:16
|
(128) Мне нужен очень быстрый алгоритм. В школе такому не учат )
|
|||
130
Мутабор
10.12.09
✎
15:11
|
(103) Как же меня задолбали такие умники:
Процедура КнопкаВыполнитьНажатие(Кнопка) Перем Временно, Результат, Бит; Бит = 128; Результат = ""; Временно = Десятичное; Пока Бит >= 1 Цикл Если Временно >= Бит Тогда Результат = Результат + "1"; Временно = Временно - Бит; Иначе Результат = Результат + "0"; КонецЕсли; Бит = Бит / 2; КонецЦикла; Сообщить(Результат); КонецПроцедуры |
|||
131
Мутабор
10.12.09
✎
15:19
|
Ну где этот умник фишер?
|
|||
132
НЕА123
10.12.09
✎
15:21
|
(0)
учат в школе так Ч%2+ Цел(Ч/2)%2+ Цел(Ч/4)%2+ Цел(Ч/8)%2+ Цел(Ч/16)%2+ Цел(Ч/32)%2+ Цел(Ч/64)%2+ Цел(Ч/128) |
|||
133
НЕА123
10.12.09
✎
15:23
|
+(132)
но (130) красивше. |
|||
134
Эстет хренов
10.12.09
✎
15:30
|
Что бы быстро считало нужно все циклы развернуть и сделать кейс из 256 случаев
|
|||
135
НЕА123
10.12.09
✎
15:35
|
(134)
ну уж лучше без кейса. в массив или лучше в соответствие засунуть. |
|||
136
vogenut
10.12.09
✎
16:13
|
(135) Хм, лучше в соответствие чем в массив? Поиск O(log N) лучше чем O(1)?
|
|||
137
НЕА123
10.12.09
✎
16:38
|
(136)
наверное, да, для фиксированного массива O(1) (что-забыл про него). для обычного - сильно сомневаюсь, скорее всего O(N). |
|||
138
vogenut
10.12.09
✎
16:55
|
(137) С чего это вдруг для обычного O(n), если доступ по индексу?
|
|||
139
fisher
10.12.09
✎
17:13
|
(131) Виноват. Невнимательно читал. Решил, что твоё предложение идентично (91), а там вычитания не было.
|
|||
140
fisher
10.12.09
✎
17:17
|
(132) Вариант в (32) отработает быстрее для небольших чисел плюс он более универсален.
|
|||
141
Torquader
10.12.09
✎
21:44
|
(132)
К сожалению, в 1С нет оператора целочисленного деления, поэтому, если мы выполняем деление - то переходим в дробные числа, которые нужно округлять. Понятно, что в Visual Basic мы радостно пишем Число\2 и не имеем проблем с потерей производительности. (137) Поиск по массиву из 256 элементов, это одна индексная операция сложения адреса поэтому О(1). Однако, если число больше одного байта, то уже начинаются сложности, так как для двух байтов массив уже съест достаточно памяти (65536*4+21). |
|||
142
Мутабор
11.12.09
✎
06:31
|
Исправил чуток:
Процедура КнопкаВыполнитьНажатие(Кнопка) Перем Временно, Результат, Бит; Временно = Десятичное; Результат = ""; Бит = 1; Пока Бит * 2 <= Временно Цикл Бит = Бит * 2; КонецЦикла; Пока Бит >= 1 Цикл Если Временно >= Бит Тогда Результат = Результат + "1"; Временно = Временно - Бит; Иначе Результат = Результат + "0"; КонецЕсли; Бит = Бит / 2; КонецЦикла; Пока СтрДлина(Результат) / 8 <> Цел(СтрДлина(Результат) / 8) Цикл результат = "0" + Результат; КонецЦикла; Сообщить(Результат); КонецПроцедуры |
|||
143
supremum
11.12.09
✎
07:55
|
(141) или две индексные операции плюс одна сложения :) (для двух байт)
|
|||
144
Kraft
11.12.09
✎
08:21
|
(0) и давно ты программист?
|
|||
145
Kraft
11.12.09
✎
08:21
|
вернее так:
и давно ты "программист"? |
|||
146
НЕА123
11.12.09
✎
08:56
|
(138) (141)
потому что физически массив в 1С - это, скорее всего, список. т.к. трудно представить метод Добавить() у классического массива. |
|||
147
vogenut
11.12.09
✎
09:02
|
(144) 20 лет где-то
|
|||
148
vogenut
11.12.09
✎
09:03
|
(146) Фи, практически любая реализация классического массива в любом языке имеет метод Добавить. Например STL vectort
|
|||
149
НЕА123
11.12.09
✎
09:06
|
насчет массива
Массив256 = Новый Массив; Массив256.Добавить(0); Пока Массив256.Количество() < 256 Цикл Для к = 0 по Массив256.Вграница() Цикл Массив256.Добавить(1 + Массив256[к]); КонецЦикла; КонецЦикла; |
|||
150
НЕА123
11.12.09
✎
09:07
|
(148)
да. но это уже не O(1). |
|||
151
vogenut
11.12.09
✎
09:08
|
(148) Так речь не про сложность Добавить, а про сложность []
|
|||
152
НЕА123
11.12.09
✎
09:09
|
(148)
насчет любого языка - неправда. |
|||
153
vogenut
11.12.09
✎
09:10
|
(152) В тех, которые я знаю, правда )
|
|||
154
НЕА123
11.12.09
✎
09:13
|
(151)
когда объявляется массив - выделяется память размером N*L, где N - колво элементов, L - размер элемента. при обращении по индексу - да O(1). но как в этот массив можно Добавить()? так что в 1С это список, может и индексирован(что сомнительно) . про фиксированный массив не знаю. |
|||
155
НЕА123
11.12.09
✎
09:15
|
(153)
понятно. ассемблеров, алголов, фортранов, паскалей, С не признаешь. |
|||
156
vogenut
11.12.09
✎
09:16
|
(154)
- В любом объектно (ориентированном) языке есть классы, которые реализуют понятие массива, а в структурных соответвующее API, с методом Добавить. От фиксированого массива толку мало в общеприкладной разработке - В 1С это элементарно проверить, достаточно сравнить скорость [] массива и структуры, например ) |
|||
157
Mikeware
11.12.09
✎
09:18
|
(156) Бедняга...
|
|||
158
vogenut
11.12.09
✎
09:18
|
(155) Нет, просто в этих языках пользуют библиотеки функций для работы с контейнерами. В принципе это ничем не отличается от объектов, кроме как видом.
|
|||
159
vogenut
11.12.09
✎
09:18
|
(157) А кому сейчас легко )
|
|||
160
НЕА123
11.12.09
✎
09:21
|
(156)
на ТЗ, проверял на 77. O(N). |
|||
161
vogenut
11.12.09
✎
09:22
|
(160) ТЗ это вещь достаточно сложная. Как минимум это двумерный массив. Но с учетом поддержки индексов, столбцов и прочего, внутренняя структура скорее всего достаточно сложна.
|
|||
162
НЕА123
11.12.09
✎
09:50
|
(161)
да. но классический двумерный массив = O(1). |
|||
163
vogenut
11.12.09
✎
09:59
|
(162) Но ТЗ это не классический двумерный массив )
|
|||
164
НЕА123
11.12.09
✎
10:01
|
(163)
да. как и массив. |
|||
165
vogenut
11.12.09
✎
10:06
|
(164) Массив простой как дырка от бублика. А ТЗ более продвинутая вещь. Да и опыты показывают, что у массива операция [] имеет сложность О(1).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |