У меня есть дерево управления с флажками рядом с каждым узлом, который позволяет проверять, неконтролируемые и средние проверенные состояния на узлах. При нажатии узла родительский элемент и дочерние элементы обновляются. Код, который я нашел, что трюк использует смещение битов, и я пытаюсь понять, что именно происходит.Может кто-нибудь объяснить этот код манипуляции бит?
Может кто-нибудь объяснить следующий код? Или даже лучше, перепишите этот код, чтобы его было легче понять?
// click event handler
private function eventMessageTree_itemCheckHandler(event:TreeEvent):void {
var node:ITreeNode = ITreeNode(event.item);
var checkState:uint = TreecheckboxItemRenderer(event.itemRenderer).checkBox.checkState;
updateParents(node, checkState);
updateChilds(node, checkState);
}
private function updateChilds(item:ITreeNode, value:uint):void {
var middle:Boolean = (value & 2 << 1) == (2 << 1);
var selected:Boolean = (value & 1 << 1) == (1 << 1);
if (item.children.length > 0 && !middle) {
for each (var childNode:ITreeNode in item.children) {
childNode.checked = value == (1 << 1 | 2 << 1) ? "2" : value == (1 << 1) ? "1" : "0";
updateChilds(childNode, value);
}
}
}
private function updateParents(item:ITreeNode, value:uint): void {
var checkValue:String = (value == (1 << 1 | 2 << 1) ? "2" : value == (1 << 1) ? "1" : "0");
var parentNode:ITreeNode = item.parent;
if (parentNode) {
for each (var childNode:ITreeNode in parentNode.children) {
if (childNode.checked != checkValue) {
checkValue = "2";
}
}
parentNode.checked = checkValue;
updateParents(parentNode, value);
}
}
Спасибо за ваш ответ. Поэтому, если я правильно понял, я мог бы просто заменить 1 << 2 или 2 << 1 на 4, верно? Есть ли какая-либо польза в использовании сдвига бит вместо постоянного числа 4? –
Без выгоды. Вы также можете заменить (1 << 1 | 2 << 1) на 6. Читабельность, вероятно, такая же плохая, как оригинал, но, по крайней мере, она короче. Жесткое кодирование обоих операндов имеет смысл только при объявлении константы как UNCHECKED = 1 << 2 вместо UNCHECKED = 4, чтобы подчеркнуть, какой бит вы устанавливаете –