int main() { int a; printf("Enter an integer: "); scanf("%d", &a); printf("Rev bits: %d", revbits(a)); return 0; }
void setup(void) { memset(&root, 0, sizeof(root)); memset(&rroot, 0, sizeof(rroot)); memset(&a, 0, sizeof(a)); memset(&b, 0, sizeof(b)); memset(&c, 0, sizeof(c)); memset(&d, 0, sizeof(d)); root.key = 0; root.keylen = 0; root.datum = NULL; root.left = &rroot; root.right = NULL; rroot.key = revbits(mkkey("44.0.0.0")); rroot.keylen = 8; rroot.datum = (void *)rv; rroot.left = &a; rroot.right = &b; a.key = (revbits(mkkey("44.0.0.1")) >> 8); a.keylen = 24; a.datum = (void *)av; a.left = NULL; a.right = NULL; b.key = (revbits(mkkey("44.130.0.0")) >> 8); b.keylen = 8; b.datum = (void *)bv; b.left = &c; b.right = &d; c.key = (revbits(mkkey("44.130.24.0")) >> 16); c.keylen = 8; c.datum = (void *)cv; c.left = &e; c.right = NULL; d.key = (revbits(mkkey("44.130.130.0")) >> 16); d.keylen = 8; d.datum = (void *)dv; d.left = NULL; d.right = NULL; e.key = (revbits(mkkey("44.130.24.25")) >> 24); e.keylen = 8; e.datum = (void *)ev; e.left = NULL; e.right = NULL; }
void ocin_gen_bitrev::init (tsim_object *parent, string _name) { { // BitRev is broken stringstream tmp; tmp << "BitRev generator is broken! Reasons: \n" << " a) it doesn't support terminal nodes (source->dest mapping) \n" << " b) it's operating on node numbers (instead of coords, eg: bit-comp, transpose). Double check!!"; ocin_name_fatal(_name,tmp.str()); exit(0); } name = _name; gen_done = false; tsim_module::init (parent, name); top_p = (ocin_top *) parent; // setup the packet monitor mon = new ocin_mon_packet; mon->init(name, nodes.size()); #ifdef DEBUG { stringstream tmp; tmp << "Initializing Packet Generator"; ocin_name_debug(name,tmp.str()); } #endif vector<string>::iterator srcs_it; // To speed things up a bit we are creating an order'ed vector of // local_iu pointers here and I'll iterate over them instead using // the node map directly. // iterate over the sources and push pointers onto a list for (srcs_it = srcs.begin(); srcs_it != srcs.end(); srcs_it++) { string src = terminal2node_map[srcs_it->c_str()]; int port = terminal2port_map[srcs_it->c_str()]; local_iu_ptrs.push_back(&(nodes[src].local_iu[port])); #ifdef DEBUG { stringstream tmp; tmp << "Packet Gen source:"<<srcs_it->c_str(); ocin_name_debug(name,tmp.str()); } #endif } vector<string>::iterator dsts_it; #ifdef DEBUG { for (dsts_it = dsts.begin(); dsts_it != dsts.end(); dsts_it++) { stringstream tmp; tmp << "Packet Gen ejector:"<<dsts_it->c_str(); ocin_name_debug(name,tmp.str()); } } #endif // Pre-compute a the src->dst map // need this to compute the reverse num unsigned maxnode_num = srcs.size()-1; // we assume that the srcs order is the node numbering to reverse. for (unsigned x = 0; x <= maxnode_num; x++) { unsigned bitrev = revbits(x, maxnode_num); string rev_name = srcs[bitrev]; // now that we have the bitrev's name we look for a matching dest bool found = false; for (dsts_it = dsts.begin(); dsts_it != dsts.end(); dsts_it++) { if (*dsts_it == rev_name) { src_to_dst[srcs[x].c_str()] = dsts_it->c_str(); found = true; #ifdef DEBUG { stringstream tmp; tmp << "Bit Reversal pair :"<<srcs[x].c_str() << " -> "<< dsts_it->c_str(); ocin_name_debug(name,tmp.str()); } #endif } } if (found == false) { cout << name << ": Warning source " <<srcs[x].c_str() << " does not have a valid bit reversal destination, it will be skipped as a source\n"; } } }