 
			
				06.01.2011, 11:49
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Особый гость 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.04.2010 
					
					
					
						Сообщений: 4,260
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		~ - унарный оператор, который выполняет порязрядное инвертирование, в т.е. ~1 == 0, ~0 == 1. 
	
 
	| 
		
			Сообщение от Kepa
			
		
	 | 
 
	| 
		Но насколько я понимаю он понятен человеку, но очень неудобен для "компьютера" в вычислениях (а может и вообще непригоден)
	 | 
 
	
 
 с точностью наоборот (если не не брать в рачет особенности отдельных индивидуумов)  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				06.01.2011, 12:12
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 05.12.2010 
					
					
					
						Сообщений: 27
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от monolithed
			 
		
	 | 
 
	| 
		~ - унарный оператор, который выполняет порязрядное инвертирование, в т.е. ~1 == 0, ~0 == 1.
	 | 
 
	
 
 Как работает поразрядное отрицание я понимаю, вопрос был совсем не об этом, а о представлении целых отрицательных.
 
	
 
	
		
			Сообщение от monolithed
			 
		
	 | 
 
	
		"Но насколько я понимаю он понятен человеку, но очень неудобен для "компьютера" в вычислениях (а может и вообще непригоден)" 
 
с точностью наоборот (если не не брать в рачет особенности отдельных индивидуумов)
	 | 
 
	
 
 Данная цитата относилась к такому представлению отрицательных чисел, где изменяется лишь старший разряд:
 
-314 = 10000000000000000000000100111010
 
Как такое может быть менее понятно для человека, чем порязрядное отрицание с дополнением до двойки
 
-314 = 11111111111111111111111011000110
 
я не понимаю, может я вхожу в число тех нескольких индивидуумов?    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				06.01.2011, 20:15
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 
 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.12.2008 
					
					
					
						Сообщений: 4,201
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Kepa
			
		
	 | 
 
	
		Пока вы спорите у меня возник новый вопрос   
 
Прочитал про поразрядное НЕ (~) и у меня возникло недопонимание - как именно представляются отрицательные целые числа (http://javascript.ru/bitwise-operators - эту статью я тоже читал, но все равно до конца так и не понял), поясню: 
 
Число у нас представляется 32 разрядами, при этом старший (левый) разряд - знаковый, т.е. у нас диапазон чисел, если я правильно понял, от (2^31 - 1) до -(2^31). Далее, как представляются целые положительные числа в двоичной системе мне понятно, 1=1; 2=10; 3=11; 4=100; и т.д., при этом все разряды левее старшей единицы равны 0, а вот как представляются отрицательные мне уже непонятно, ну за тем исключением что старший бит равен 1. Возьмем пример из статьи: 
 
314 = 00000000000000000000000100111010 
 
-314 = 11111111111111111111111011000110 
 
Так вот, что мне здесь непонятно - по какому алгоритму во втором случае мы "получаем" из этой последовательности -314, например мне было бы понятен такой вариант (http://en.wikipedia.org/wiki/Signed_...gnitude_method): 
 
-314 = 10000000000000000000000100111010 
 
Но насколько я понимаю он понятен человеку, но очень неудобен для "компьютера" в вычислениях (а может и вообще непригоден), в таком случае мне был бы еще понятен вариант такой (http://en.wikipedia.org/wiki/Signed_....27_complement): 
 
-314 = 11111111111111111111111011000101 
 
Т.е. это ~314, без "дополнения до двойки" - здесь я бы понимал что мы "получаем" -314 как разность максимального числа (все разряды равны 1) и 314, а старший бит указывает что число отрицательное, но в статье говорится что надо еще прибавить единицу, и вот тут я не понимаю, откуда берется эта единица и почему полученный после "дополнения до двойки" результат будет -314. В целом я подозреваю что тут что-то завязано с арифметикой целых чисел (например, если знаковый бит считать за обычный, то (0-1) будет равно максимальному числу, скажем для 8-ми разрядного без знакового представления 0-1 = 255. Будет здорово если кто-нибудь разжует данный момент (: 
 
P.S. Пока писал еще пришла мысль что это может быть связано с тем что у нас нет "отрицательного" нуля и поэтому у нас отрицательных чисел на одно больше чем положительных, может дело в этом? В любом случае хочется точно знать.
	 | 
 
	
 
 (добавил ссылки на википедию)
 
откуда берется единица: 
-0010 = 10000 - 0010 = 1111 - 0010 + 0001 = ~0010 + 0001 
фактически, в случае ones' complement мы выбираем в качестве нуля 01111, а в случае two's complement - 10000, т.е. на единицу большее число. В результате (two's complement): у нас один ноль, не надо добавлять к результату бит переноса  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				06.01.2011, 20:29
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 
 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.12.2008 
					
					
					
						Сообщений: 4,201
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 а объяснить все это можно, думаю, так: 
 
нам надо вычесть 0001 (1) из 0010 (2), но мы хотим избавиться от вычитания, т.е. сделать это используя операцию сложения. Отметим, что xxxx + 10000 = xxxx. Тогда 0010 - 0001 = 0010 + 10000 - 0001 = 0010 + <two's complement of 0001> 
 
p.s. это бытовое объяснение на пальцах, и я не в курсе как оно видится с точки зрения представителей академической науки 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				07.01.2011, 07:55
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.06.2009 
					
					
					
						Сообщений: 92
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			 Цитата: 
		
	 | 
 
	
		
Пример15.5. Сортировка элементов в алфавитном порядке
<script>
function sortkids(e) {
    // Это элемент, потомки которого должны быть отсортированы
    if (typeof e == "string") e = document.getElementById(e);
    // Скопировать дочерние элементы (не текстовые узлы) в массив
    var kids = [];
    for(var x = e.firstChild; x != null; x = x.nextSibling)
        if (x.nodeType == 1 /* Node.ELEMENT_NODE */) kids.push(x);
    // Выполнить сортировку массива на основе текстового содержимого
    // каждого дочернего элемента. Здесь предполагается, что каждый
    // потомок имеет единственный вложенный элемент – узел Text 
    kids.sort(function(n, m) {     // Функция сравнения для сортировки
        var s = n.firstChild.data; // Текстовое содержимое узла n
        var t = m.firstChild.data; // Текстовое содержимое узла m
        if (s < t) return  1;      // Узел n должен быть выше узла m
        else if (s > t) return 1;  // Узел n должен быть ниже узла m
        else return 0;             // Узлы n и m эквивалентны
    });
    
    // Теперь нужно перенести узлыыпотомки обратно в родительский элемент
    // в отсортированном порядке. Когда в документ вставляется уже 
    // существующий элемент, он автоматически удаляется из текущей позиции,
    // в результате операция добавления этих копий элементов автоматически
    // перемещает их из старой позиции. Примечательно, что все текстовые узлы, 
    // которые были пропущены, останутся на месте.
    for(var i = 0; i < kids.length; i++) e.appendChild(kids[i]);
}
</script>
<ul id="list"> <!—Этот список будет отсортирован   >
<li>один<li>два<li>три<li>четыре<li>пять 
<!!! элементы не в алфавитном порядке   >
</ul>
<!!! кнопка, щелчок на которой запускает сортировку списка   >
<button onclick="sortkids('list')">Сортировать</button>
	 | 
 
	
 
 просьба прокомментировать: 
1. Ситуацию с циклом for: видимо есть какой то шаблон (каркас), на котором можно реализовывать различные варианты циклов for: ( in )? (firstChild, !=null, nextSibling). В частности как работает вариант с firstChild, nextSibling? 
2. Все таки ситуацию с sort()-ом, не понять: 
 2.1 Сравнивающая функция может иметь только 2 аргумента? 
 2.2 Эти m и n ни что иное как l и r в  QuickSort?   
Как вообще лучше читать такие сорты? 
А то у меня мозг перегревается их анализировать    
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось JSTalker, 07.01.2011 в 08:01.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				07.01.2011, 09:00
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 05.12.2010 
					
					
					
						Сообщений: 27
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 x-yuri, 
 
Спасибо, более-менее разобрался (: 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				07.01.2011, 13:48
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Особый гость 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.04.2010 
					
					
					
						Сообщений: 4,260
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от JSTalker
			
		
	 | 
 
	| 
		Ситуацию с циклом for: видимо есть какой то шаблон (каркас)
	 | 
 
	
 
 не знаю насколько корректно получилось, но как-то так:
 
for(<инициализация>;<условие>;<корректирование>){
//тело цикла
}
Цикл начинает работу (ищит следущий дочерний элемент e) с выражения x = e.firstChild, и работает до тех пор пока не получит значение null (как доберется до несущестующего элемента - e.lastChild+1)
 
Может этот вариант поможет понять:
 
<script type="text/javascript">
window.onload = function(){
    var element = document.getElementById('div'), //родительский элемент
        children = element.childNodes, //дочернии элементы
        i = children.length, array = []; //получаем количество элементов и создаем пустой массив
    if(element.hasChildNodes()) { //проверяем есть ли дочернии элементы
        while(i--){
            if(children[i].tagName != undefined) { //отбираем, только те которые не имеют значение undefined
                array.push(children[i].tagName + ': ' +children[i].innerHTML + '\n'); //добавляем в массив
            }
        }
    }
    alert(array.join(''));
};
</script>
<div id="div">
    <div>0</div>
    <div>1</div>
    <div>2</div>
</div>
тоже самое (без линих проверок), только пошустрей:
 
var element = document.getElementById('div').childNodes, i = element.length, array = [];
while(i--){
    array.push(element[i].nodeType == 1 ? element[i].innerHTML + '\n' : '');
}
alert(array.join(''));
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось monolithed, 07.01.2011 в 19:42.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				07.01.2011, 17:32
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 
 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.12.2008 
					
					
					
						Сообщений: 4,201
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
<!DOCTYPE HTML>
<html>
  <head>
      <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/mootools/1.3.0/mootools-yui-compressed.js"></script>
  </head>
  <body>   
  <ul id="list">
      <li>один<li>два<li>три<li>четыре<li>пять
  </ul>
  <button>Сортировать</button>
  <script>
    $$('button').addEvent('click', function(){
        $('list').getChildren()
            .sort(function(a, b){
                if( a.get('text') == b.get('text') )
                    return 0;
                return   a.get('text') < b.get('text')
                    ? -1
                    : 1;
            })
            .inject( $('list') );
    });
  </script>
  </body>
</html>
---
 
var element = document.getElementById('div'), //родительский элемент
        children = element.childNodes, //дочернии элементы
        i = children.length, array = []; //получаем количество элементов и создаем пустой массив
    if(element.hasChildNodes()) { //проверяем есть ли дочернии элементы
        while(i--){
            if(children[i].tagName != undefined) { //отбираем, только те которые не имеют значение undefined
                array.push(children[i].tagName + ': ' +children[i].innerHTML + '\n'); //добавляем в массив
            }
        }
    }
может в каких-нибудь фреймворках такой код и имеет смысл, но только не в real life...
 
	
 
	| 
		
			Сообщение от JSTalker
			
		
	 | 
 
	| 
		1. Ситуацию с циклом for: видимо есть какой то шаблон (каркас), на котором можно реализовывать различные варианты циклов for: ( in )? (firstChild, !=null, nextSibling). В частности как работает вариант с firstChild, nextSibling?
	 | 
 
	
 
 ты не знаешь, как работает for?  http://javascript.ru/for
	
 
	| 
		
			Сообщение от JSTalker
			
		
	 | 
 
	
		2. Все таки ситуацию с sort()-ом, не понять: 
 2.1 Сравнивающая функция может иметь только 2 аргумента? 
 2.2 Эти m и n ни что иное как l и r в QuickSort?   
Как вообще лучше читать такие сорты?
	 | 
 
	
 
 да, 2 аргумента и не важно как сортировка реализована. Твоя задача: вернуть -1, 0 или 1
 
	
 
	| 
		
			Сообщение от Kepa
			
		
	 | 
 
	| 
		Спасибо, более-менее разобрался (:
	 | 
 
	
 
 и все же не до конца?  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				07.01.2011, 17:38
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 05.12.2010 
					
					
					
						Сообщений: 27
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от x-yuri
			
		
	 | 
 
	| 
		и все же не до конца?
	 | 
 
	
 
 Нет, вполне разобрался - суть в том что у нас нет отрицательного нуля, поэтому при поразрядном отрицании мы получаем отрицательное число, модуль которого на 1 больше изначального, и чтобы его привести к соответствию мы добавляем единицу. Просто чтобы "привыкнуть" к этому надо немного времени и практики (:  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				07.01.2011, 18:02
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Kepa
			
		
	 | 
 
	| 
		суть в том что у нас нет отрицательного нуля
	 | 
 
	
 
 В JS есть. 
 http://javascript.ru/ecma/part8#a-8.5
	
 
	| 
		
			 Цитата: 
		
	 | 
 
	| 
		Заметим, что существуют как положительный ноль, так и отрицательный ноль.Для краткости и в пояснительных целях эти значения также могут обозначаться +0 и -0 соответственно. (Заметим, что эти два нулевых числовых значения получаются при помощи выражений +0 (или просто 0) и -0.)
	 | 
 
	
 
  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |