J'ai un contrôle d'arbre avec des cases à cocher à côté de chaque nœud qui permet des états vérifiés, non cochés et intermédiaires sur les nœuds. Lorsque vous cliquez sur un noeud, le parent et les enfants sont mis à jour. Le code que j'ai trouvé qui fait l'affaire utilise le décalage de bits et j'essaie de comprendre ce qui se passe exactement.Quelqu'un peut-il expliquer ce code de manipulation de bits?
Quelqu'un peut-il expliquer le code suivant? Ou encore mieux, réécrire ce code pour qu'il soit plus facile à comprendre?
// 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);
}
}
Merci pour votre réponse. Donc si je comprends bien, je pourrais juste remplacer 1 << 2 ou 2 << 1 par 4, non? Y at-il un avantage à utiliser le décalage de bits au lieu du nombre constant 4? –
Aucun avantage. Vous pouvez également remplacer (1 << 1 | 2 << 1) par 6. Du point de vue de la lisibilité, c'est probablement aussi mauvais que l'original, mais au moins c'est plus court. Le codage en dur des deux opérandes n'a de sens que lors de la déclaration d'un const comme UNCHECKED = 1 << 2, au lieu de UNCHECKED = 4, pour souligner le bit que vous définissez –