|
|
|
| как при выводе массива в foreach() или for() каждый второй элемент пропускать | |
|
|
|
|
|
|
|
для: dima2207
(13.05.2010 в 16:16)
| | Проверять младший разряд итерации цикла. | |
|
|
|
|
|
|
|
для: dima2207
(13.05.2010 в 16:16)
| | Можно отталкиваться от следующего скрипта
<?php
for($i = 0; $i < 100; $i++)
{
if($i % 2) echo "$i<br>";
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(13.05.2010 в 17:15)
| | спасибо cheops то что надо . | |
|
|
|
|
|
|
|
для: dima2207
(13.05.2010 в 17:19)
| | Лучше использовать для этого логическую операцию. | |
|
|
|
|
|
|
|
для: sim5
(13.05.2010 в 17:30)
| | Поразрядную? В примере выше как раз логическая операция. | |
|
|
|
|
|
|
|
для: cheops
(13.05.2010 в 17:32)
| |
<?php
for($i = 0; $i < 8; $i++) echo !($i&1) ? $i."<br>" : null;
|
| |
|
|
|
|
|
|
|
для: sim5
(13.05.2010 в 17:42)
| | мама мия...
<?
for($i = 0; $i < 8; $i+=2) echo $i."<br>" ;
|
PS. Для while/foreach таки да - проверкой. | |
|
|
|
|
|
|
|
для: Trianon
(13.05.2010 в 19:34)
| | ахахааха), все гениальное - просто | |
|
|
|
|
|
|
|
для: sim5
(13.05.2010 в 17:42)
| | >
>for($i = 0; $i < 8; $i++) echo !($i&1) ? $i."<br>" : null;
>
|
А не могли бы пояснить нубу что это или где можна прочитать про это???? оО
И if($i % 2) - как оно работает без ==? | |
|
|
|
|
|
|
|
для: Desko
(13.05.2010 в 21:04)
| | >>
>>for($i = 0; $i < 8; $i++) echo !($i&1) ? $i."<br>" : null;
>>
|
>
>А не могли бы пояснить нубу что это или где можна прочитать про это???? оО
А про что именно (может в рамках форума можно объяснить)?
>И if($i % 2) - как оно работает без ==?
Дело в том, что выражение в if неявно приводится к логическому типу, все что 0 - false, все что отлично от нуля - true. | |
|
|
|
|
|
|
|
для: cheops
(13.05.2010 в 21:33)
| | Интересует строка echo !($i&1) ? $i."<br>" : null;>>>[code]
В принципе непонятно ничего!!! Это вообще PHP? | |
|
|
|
|
|
|
|
для: Desko
(13.05.2010 в 21:43)
| | Здесь используется тренарный оператор x ? y : z, который возвращает y, если x == true и z, в противном случае. Он достаточно редко применяется из-за его низкой читабельности, но считается более удобным по сравнению с if(x) { y } else { z }, если y и z - однострочные операторы. | |
|
|
|
|
|
|
|
для: Desko
(13.05.2010 в 21:43)
| | & - это побитовое "И".
Предположим что переменная $i содержит число 6, это число в двоичном представлении дает нам вот что: 110.
Вот из мануала, или откуда-то еще: $a & $b - Побитовое 'и'. Устанавливаются только те биты, которые установлены и в $a, и в $b.
Смотрим: у нас есть 110 и 1. 1 приведем к 001 для простоты... Получается 110 И 001, получается 0. Если вы еще не поняли, то все четные числа в двоичном представлении заканчиваются на 0... Вот и получается, что если к этому оператору еще отрицание добавить, то мы будем получать четность числа... | |
|
|
|
|
|
|
|
для: nikita2206
(13.05.2010 в 21:55)
| | Понял спасибо | |
|
|
|
|
|
|
|
для: nikita2206
(13.05.2010 в 21:55)
| | Лигическое И, это логическая операция, которая может быть бинарной (иметь два операнда), тринарной (иметь три операнда), n-арной (иметь n операндов) операцией, и в результате выдает 1, если все операнды равны 1, в противном случае 0.
Называется логическим умножением или конъюкцией (от латинского conjunctio, что означает союз, связь). Логическое И часто применяется как маска для выделения n-разрядов в позиции операнда.
Если речь у автора шла именно о "пропустить", то решать надо так, как написано у Trianon, но если автор имел ввиду (что зачастую и спрашивают) чередование вывода чего-то, то это только проверкой. А взята логическая операция потому, что она более быстрая нежели деление, так как требуется загрузка всего одного операнда в аккумулятор, где и производятся операции, в данном случае всего над одним операндом. Зачастую и само деление можно (и нужно при интенсивных вычислениях) заменять логической операцией сдвига, это будет работать гораздо быстрее. | |
|
|
|
|
|
|
|
для: sim5
(14.05.2010 в 04:38)
| | >Логическое И, это логическая операция, которая может быть бинарной (иметь два операнда), тринарной (иметь три операнда), n-арной (иметь n операндов) операцией, и в результате выдает 1, если все операнды равны 1, в противном случае 0.
Логическое И - бинарная, и лишь бинарная операция.
Тренарной ( тетрарной и n-арной ) может быть лишь композиция нескольких атомарных операций.
a&b&c - это не тренарная операция. Это только сокращение от (a&b)&c | |
|
|
|
|
|
|
|
для: Trianon
(14.05.2010 в 12:44)
| | Ошибаетесь. Речь идет не о прдеставлении данных (двоичные), а о логическом вентеле на n-входов. | |
|
|
|
|
|
|
|
для: sim5
(14.05.2010 в 12:57)
| | логический вентиль на N входов, реализующий композитную операцию, я представляю себе лишь на многоэмиттерном транзисторе.
Вот когда хотя бы один язык программирования будет компилироваться в код, при котором операнды операции И будут подаваться на входы физически соответствующее этим самым эмиттерам - тогда и поговорим.
А до той поры это чушь. Математически операция И является бинарной и точка. | |
|
|
|
|
|
|
|
для: Trianon
(14.05.2010 в 13:42)
| | Вот только не надо говорить о яйце и курице.;-)
Логика, ее базовые элементы, родились задолго до появления первого процессора, и понятия о логических операциях происходят от туда. Как решает задачу процессор, об этом и речи не было. Это и ежу понятно, что процессор не будет соеденять n-регистров или ячеек памяти в физическое "И", дабы произвести логическую операцию на n-операндами. Так что, это вы не в ту сторону пошли в своих рассуждениях.
Да и базовые элементы логики, это совсем не обязательно многоэммитерные транзисторы. | |
|
|
|
|
|
|
|
для: sim5
(14.05.2010 в 14:03)
| | так тем более нет n-арных логических операций.
также точно как нет операции суммирования, хотя есть операция сложения. | |
|
|
|
|
|
|
|
для: Trianon
(14.05.2010 в 16:33)
| | Логичекий элемент базовой логики может иметь любое количество входов, как и никто не запрещает производить лигическую операцию И над любым числом операндов (имеется ввиду запись): 1 & 3 & 2 & 6 & .... Речь изначально шла именно об этом.
А вы что доказываете? Вы хотите переписать базовые понятия логики? | |
|
|
|
|
|
|
|
для: sim5
(14.05.2010 в 16:40)
| | логический элемент базового набора логических микросхем это еще не логическая операция базовой логики как раздела математики.
микросхемы - это вообще не печка, от которой стоит плясать.
А в логике как науке, операция И - бинарная.
Запись же 1& 3 & 5 & 7 означает именно то, что я написал. Композицию (цепочку элементарных) операций согласно заданным правилам приоритета и ассоциативности. Даром, что они (приоритет и ассоциативность) на результат (в побитовом варианте) не влияют. | |
|
|
|
|
|
|
|
для: Trianon
(14.05.2010 в 17:29)
| | Какой-то беспредметный и бесполезный спор. | |
|
|
|
|
|
|
|
для: Trianon
(14.05.2010 в 17:29)
| | Полез в книги по алгебре... вообще-то можно операции x & y & ... & z трактовать как n-арные, понятие n-арной операции это не запрещает. Только обычно сворачивают такие пространства до бинарных операций, так как на них можно строго построить отношения порядка и эквивалентности. Такая свертка приводит к понятию композиции и позволяет оставаться в пространстве бинарных отношений. | |
|
|
|
|
|
|
|
для: cheops
(15.05.2010 в 12:41)
| | Ну об этом речь и была ) Если говорить о просто логическом элементе, так в нем сравнение происходит вопреки нашим понятиям и условностям, работают сразу все все входы вентеля, и соответственно операция умножения сразу всех операндов. | |
|
|
|
|
|
|
|
для: cheops
(15.05.2010 в 12:41)
| | Про то и речь :))
Впрочем, n-арную операцию всяко пришлось бы записать как-то иначе.
не как x&y&z&t а как _and_(x,y,z,t) к примеру.
Потому как иначе возникла бы семантическая неоднозначность -
не отличить запись n-арной операции от записи композиции более простых. | |
|
|
|
|
|
|
|
для: Trianon
(16.05.2010 в 16:13)
| | Даже не смотря на то, что существуют компьютеры, никто не отменял и никуда не канули устройства на обычных логических элементах. Изначально перед разработчиком соит задача решения функции над входными данными, которая требует n-элементов различной логики для этого. Мнемонизация функций позволяет исключить из устройства "лишние" элементы, и вместо требемого изначально, например, элемента 6И, в конечном итоге для реализации функции достаточно будет элемента 3И-НЕ.
Кроме того, хоть велика роль контроллеров, существовали и будут существовать ИС, в основе которых программируемые логические матрицы (PLM).
Для всех этих устройств понятие "логические операции могут быть только бинарными" просто абсурдно. Да оно вообще абсурдно такое утверждение по смыслу. Да и логические операции появились задолго до компьютеров и средств программрования их. Вот об этом была речь. Вы же явно утверждали противоположное. | |
|
|
|
|
|
|
|
для: sim5
(16.05.2010 в 16:35)
| | Вы можете оставаться при своем мнении.
Как и в ситуации с тем, что можно (а что нельзя ) называть виртуальной памятью, спорить с Вами надоело. | |
|
|
|
|
|
|
|
для: Trianon
(16.05.2010 в 16:54)
| | >А в логике как науке, операция И - бинарная.
Это ваши слова. Я могу конечно остаться при своем мнении, но для логики как раз, такое утверждение абсурд. Это равнозначно как иметь выражения:
2+2+2+2=8
и
2х4=8
при этом утверждать, что первое из них не имеет право на существовние, и может быть только второе.
Виртуальная память, понятие довольно таки оносительное, если уж и говорить строго. | |
|
|
|
|
|
|
|
для: sim5
(16.05.2010 в 17:00)
| | Первое имеет право на существование. И означает ровно то, о чем пишут в учебниках первого класса.
Если к двойке добавить двойку, добавить еще двойку, и еще двойку, то получится восемь.
Потому как операция сложения тоже бинарная :)
Я Вам больше скажу.
На человеческом языке Вы тернарную операцию И не сможете выразить даже, не употребив при этом двух союзов. То есть не обозначив фактически намерения выполнить операцию дважды.
Тернарная операция, существуй её человеческий эквивалент, потребовала бы одного слова для обозначения.
Cheops тут упоминает, что в самом общем смысле, конечно операции более высокого порядка можно ввести, коль охота, выразив их через композиции. Таки да.
Примерно так это выражается по-русски.
Канонически: тепло и светло и мухи_не_кусают
По Вашему: тепло, светло, мухи не кусают одновременно
Вопрос: Как обычно говорят?
Таблица тернарнаой операции умножения на задней стороне школьной тетрадки потребовала бы для записи тысячи строк. | |
|
|
|
|
|
|
|
для: Trianon
(17.05.2010 в 03:18)
| | Логика, сугубо говоря, это не обязательно прерогатива компьютеров и языков программирования. Логика мышления требуется во многих сферах жизнедеятельности человека. Создав компьютер, язык программирования человек создавал уже как набор элементарных операций, которые могли бы описать ход его естественного мышления, ибо любая программа по сути таковой и является - отражением нашего мышления, представлений о том, или ином, задачи, решение которой мы возлагаем на компьютер.
Ни одно из базовых "постулатов" логики: сравнение (И), совпадение (ИЛИ), исключение (ИСКЛЮЧАЕЩЕЕ ИЛИ) не исключает, что любое из этих действий может производиться над любым множеством объектов. Исключение составляет только суждение (отрицание суждения, НЕ).
Вы пригласили в ресторан четырех друзей с условием, что каждый из них должен быть одет в смокинг. Если все четверо предстанут пред вами одновременно, вам будет достаточно одного взгляда, чтобы понять, выполнено ваше условие или нет. Но если приглашенных будет сотни, то окинуть взглядом сразу всех будет не возможно - вы будете проверять каждого в отдельности. При этом если уже первый из них не будет в смокинге, то дальнейшую проверку вы уже производить не будете - условие уже не выполнено.
Если трое друзей в ресторане будут держать над вашей чашечкой кофе три ложечки, предлагая добавить в него коньяк, то вы оцените ситуацию сразу - любая из ложечек с коньяком будет отличаться от пустых соседних. Вы без долгих проверок поймете, что таки насладитесь незабываемым кофе. Но если такое предложение последует от десятка друзей, вы будете вынуждены проверять каждую ложечку в отдельности, и поймете уже после первой, же попавшейся ложечки с коньяком, что кофе будет незабываемым. Да большего "ИЛИ" и не надо, вредно для здоровья.
Мы мыслим образно, и все такие логические задачи решаем сразу, хотя при этом в нашем мозгу, возможно, решается миллионы элементарных задач. Но имея возможность решить логическую задачу за "один проход", параллельно, мы, тем не менее, можем решать ее и последовательно, изучая каждый объект в отдельности на предмет выполнения условий. Но когда условия позволяют решить задачу сразу, параллельно, мы этого делать не станем, мы не будем тратить время на неоправданные действия, и это тоже следствие нашей логики.
Если я увижу запись выражения:
echo true & true & true & true;
то мне даже Денвер запускать не нужно, я и без интерпретатора буду знать, что получу в результате 1. Я оценю всю запись сразу, даже не читая ее слева на право, идентичность всех ее операндов легко читается визуально, сразу всех. А вот интерпретатору придется «попотеть».
Процессор мыслит плоско последовательно, выполняя каждую операцию под воздействием тактовых импульсов, при этом для выполнения команд требуются от одного до нескольких тактов. В любом случае, процессор будет выполнять логические операции последовательно, независимо от того, над каким числом входных данных это действие производится. Но ведь сам процессор, на элементарном уровне, действует более эффективно. Получив команду, он ее дешифрирует, подключая, таким образом, блок микропрограммного управления, который, в свою очередь, соединит необходимые узлы шиной, решив поставленную логическую задачу. При этом уже сам этот процесс может требовать сравнение n-данных согласно условию, и это сравнение будет происходить сразу над всеми данными.
Когда-то этого было вполне достаточно. Иерархия процессора, взаимодействие всех узлов его архитектуры можно было считать идеальным. Время показало, что нет. Узкие места такого подхода не позволяют решать все возрастающие по объему задачи, поэтому идея параллельных процессоров, это естественный ход событий. Но и у этого решения есть предел.
Не стоит сомневаться в том, что появятся другие процессоры (а может быть и не процессоры, может быть, это будет называться как-то иначе), которые будут мыслить образно, также как это делает мозг человека. Тогда нынешние процессоры может, и будут выполнять в такой иерархии роль элементарных кирпичиков, не более, а может они, и вообще прекратят свое существование. При этом главный мозг такой иерархии сможет сравнивать множество объектов сразу, не последовательно, и гораздо большее число объектов, чем которым может оперировать человек.
Возможно, что человечество узнает о новом измерении пространства, и тогда выражение И первый И второй И третий И… будет дополнено новыми условиями, но именно дополнено, а не подвергнуто сомнению, ибо само это выражение вполне логично.
Процесс же оптимизации логических (и не только) выражений, это естественный процесс, позволяющий исключить лишние узлы или действия в итоге. Если говорить относительно программного решения условия, причем на действующих в настоящее время процессорных архитектурах, то можно говорить, лишь о том, что в итоге условие может быть выполнено последовательно. Но если речь идет об аппаратном уровне решения условия, то в данном случае эффективнее действовать иначе, обрабатывая сразу все входные данные.
Утверждение, что поставленное условие может решаться только так и не иначе, опираясь представлением только одной области его применения, крайне пагубно для понимания базовых знаний теми, кто только начинает их изучать. Следствие такого непонимания можно наблюдать часто, когда забегают далеко вперед, ища там ответа. Когда не могут из явного описания функций выбрать нужную. А нужно всего лишь «разложить по полочкам» естественный ход собственного мышления, из которого явно будет вытекать «это самое описание» этих самых необходимых функций. Оптимизация же, это последующий процесс. Только так и никак иначе: в глобальном плане – сверху вниз, от общего к частному; в частностях – снизу вверх, от широких возможностей базовых основ, до их минимизации. | |
|
|
|
|
|
|
|
для: Desko
(13.05.2010 в 21:04)
| | $i&1 - делает проверку первого бита...
допустим число $i = 254;. В машинном представлении это число хранится в двоичном коде, и шифруется вида:
1111 1110...
Единица в двоичном коде будет - 0000 0001..
Делаем проверку:
1111 1110 &
0000 0001....
Тут происходит операция И... Вернет естесно нуль....
Здесь происходит проверка бита каждого разряда и возвращается искомое число...
Если бы было
1110 0011 &
0010 1101
получили бы число, вида:
0010 0001... | |
|
|
|
|
|
|
|
для: Tonik992
(13.05.2010 в 22:20)
| | >$i&1 - делает проверку первого бита...
В булевой алгебре (логике) нет первого бита, есть младший бит. | |
|
|
|
|
|
|
|
для: sim5
(14.05.2010 в 04:46)
| | Эквивалентно | |
|
|
|
|
|
|
|
для: Tonik992
(14.05.2010 в 15:08)
| | Вы уверены? | |
|
|
|
|
|
|
|
для: sim5
(14.05.2010 в 15:12)
| | мне для удобство лучше общаться таким языком, а не булевой алгеброй | |
|
|
|
|
|
|
|
для: Tonik992
(14.05.2010 в 15:15)
| | Двоичная арифметика (как и десятичная), это от младшего разряда к старшему, справа налево. А вот 1-й, так кому-то может удобно считать таковым разряд слева, по принципу - читаем слева на право. ;-) | |
|
|
|
|