void fixup(struct Tree * T, struct node * temp) { struct node * z = temp; while((z->parent)->color == RED) { if(z->parent == ((z->parent)->parent)->lchild) { struct node * y = ((z->parent)->parent)->rchild; if(y->color == RED) { (z->parent)->color = BLACK; y->color = BLACK; ((z->parent)->parent)->color = RED; z = (z->parent)->parent; } else { if(z == (z->parent)->rchild) { z = z->parent; lrotate(T,z); } (z->parent)->color = BLACK; ((z->parent)->parent)->color = RED; rrotate(T,(z->parent)->parent); } } else { struct node * y = ((z->parent)->parent)->lchild; if(y->color == RED) { (z->parent)->color = BLACK; y->color = BLACK; ((z->parent)->parent)->color = RED; z = (z->parent)->parent; } else { if(z == (z->parent)->lchild) { z = z->parent; rrotate(T,z); } (z->parent)->color = BLACK; ((z->parent)->parent)->color = RED; lrotate(T,(z->parent)->parent); } } } (T->root)->color = BLACK; }
void des(const std::string& inp, std::string& key, std::string& p_encrypted) { boost::uint32_t c = bpermute(key.data(), 28, PC1[0]); boost::uint32_t d = bpermute(key.data(), 28, PC1[1]); boost::uint32_t l = rrotate(bpermute(inp.data(), 32, IP[0]),31); boost::uint32_t r = rrotate(bpermute(inp.data(), 32, IP[1]),31); boost::uint32_t rot=1; for(boost::uint32_t i=0;i<16;++i){ boost::uint32_t k[2]= { permute(rrotate28(c,rot),24,PC2[1]), permute(rrotate28(d,rot),24,PC2[0]) }; for(boost::uint32_t j=0; j<8; ++j){ boost::uint32_t x=k[j>>2]>>(j&3)*6; boost::uint32_t b=(rrotate(r,j*4)^x)&0x3f; boost::uint32_t s=(S[j][b>>3]>>((b&7)*4))&0xf; l^=rrotate(permute(s<<j*4,32,P),31); } boost::uint32_t t=l; l=r; r=t; ++rot; if(i!=0 && i!=7 && i!=14) ++rot; } char v[8]={}; packbe(v,0,rrotate(r,1)); packbe(v,4,rrotate(l,1)); l=bpermute(v,32,FP[0]); r=bpermute(v,32,FP[1]); char out[8]={}; packbe(out,0,l); packbe(out,4,r); p_encrypted.assign(out, 8); }
static void do_rotation(struct avltree *tree, struct avlnode *parent) { struct avlnode *node; /* do rotation */ while (parent) { int balance; struct avlnode *left, *right; node = parent; parent = node->parent; left = node->left; right = node->right; balance = avl_balance(node); if (balance < -1) { int son_balance = avl_balance(right); /* RR */ if (son_balance <= 0) { if (!parent) { lrotate(&tree->root); } else { lrotate(node == parent->left ? &parent->left : &parent->right); } continue; } /* RL */ if (son_balance > 0) { rrotate(&node->right); if (!parent) { lrotate(&tree->root); } else { lrotate(node == parent->left ? &parent->left : &parent->right); } continue; } assert(0); } else if (balance > 1) { int son_balance = avl_balance(left); /* LL */ if (son_balance >= 0) { if (!parent) { rrotate(&tree->root); } else { rrotate(node == parent->left ? &parent->left : &parent->right); } continue; } /* LR */ if (son_balance < 0) { lrotate(&node->left); if (!parent) { rrotate(&tree->root); } else { rrotate(node == parent->left ? &parent->left : &parent->right); } continue; } assert(0); } else { avl_update_height(node); } } }
void rrotate_2(t_all *all, int *op) { rrotate(&all->a, op); rrotate(&all->b, op); }