私は、各ノードの隣にあるチェックボックスを備えたツリーコントロールを持っています。このチェックボックスを使うと、ノード上のチェックされた状態、チェックされていない状態、および中央のチェックされた状態が可能になります。ノードをクリックすると、親と子が更新されます。私が見つけたコードでは、トリックはビットシフトを使用しており、正確に何が起こっているのかを理解しようとしています。誰かがこのビット操作コードを説明できますか?
誰かが次のコードを説明できますか?または、このコードを書き直して理解しやすくしてください。
// 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 << UNCHECKED = 1の代わりにUNCHECKED = 4のようなconstを宣言すると、両方のオペランドをハードコーディングするだけで意味があります。 –