// Program that finds the page number and offset when given the page size
// and the virtual address. Assumes that a system has a 32-bit virtual address
import java.io.*;
class Ideone {
public static final int VIRTUAL_ADDRESS = 32; // 32 bit virtual address
public static void main
(String[] args
) { if(args.length != 2) {
}
int pageSize
= Integer.
parseInt(args
[0]); int address
= Integer.
parseInt(args
[1]);
if(pageSize < 1024 || pageSize > 16384) {
"1024 - 16384");
}
if((pageSize & (pageSize - 1)) != 0) { // determines if the passed pageSize is a power of 2
}
double virtualAddressSize
= Math.
pow(2, VIRTUAL_ADDRESS
); double pages = virtualAddressSize / pageSize;
int pageBits
= (int) (Math.
log(pages
) / Math.
log(2)); // find how many page bits int otherBits = VIRTUAL_ADDRESS - pageBits; //Find the other bits
int pageNumber = (address >> otherBits); // bit shift to only keep page bits for page number
int offset = (address & (pageSize - 1)); // find the offset
System.
out.
println("The address " + address
+ " contains:"); System.
out.
println("page number = " + pageNumber
); System.
out.
println("offset = " + offset
); }
}
Ly8gUHJvZ3JhbSB0aGF0IGZpbmRzIHRoZSBwYWdlIG51bWJlciBhbmQgb2Zmc2V0IHdoZW4gZ2l2ZW4gdGhlIHBhZ2Ugc2l6ZQovLyBhbmQgdGhlIHZpcnR1YWwgYWRkcmVzcy4gIEFzc3VtZXMgdGhhdCBhIHN5c3RlbSBoYXMgYSAzMi1iaXQgdmlydHVhbCBhZGRyZXNzCgppbXBvcnQgamF2YS5pby4qOwoKIGNsYXNzIElkZW9uZSB7CglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVJUVUFMX0FERFJFU1MgPSAzMjsJLy8gMzIgYml0IHZpcnR1YWwgYWRkcmVzcwoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJaWYoYXJncy5sZW5ndGggIT0gMikgewoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGFyZ3VtZW50cyIpOwoJCX0KCQkKCQlpbnQgcGFnZVNpemUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMF0pOwogICAgCWludCBhZGRyZXNzID0gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKTsKCQkKCQlpZihwYWdlU2l6ZSA8IDEwMjQgfHwgcGFnZVNpemUgPiAxNjM4NCkgewoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYWdlIHNpemUgaXMgbm90IHdpdGhpbiB0aGUgcmFuZ2Ugb2YgIiArCgkJCQkJIjEwMjQgLSAxNjM4NCIpOwoJCX0KCQkKCQlpZigocGFnZVNpemUgJiAocGFnZVNpemUgLSAxKSkgIT0gMCkgeyAvLyBkZXRlcm1pbmVzIGlmIHRoZSBwYXNzZWQgcGFnZVNpemUgaXMgYSBwb3dlciBvZiAyCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhZ2Ugc2l6ZSBpcyBub3QgYSBwb3dlciBvZiAyIik7CgkJfQoJCQoJCWRvdWJsZSB2aXJ0dWFsQWRkcmVzc1NpemUgPSBNYXRoLnBvdygyLCBWSVJUVUFMX0FERFJFU1MpOwoJCWRvdWJsZSBwYWdlcyA9IHZpcnR1YWxBZGRyZXNzU2l6ZSAvIHBhZ2VTaXplOyAKCQlpbnQgcGFnZUJpdHMgPSAoaW50KSAoTWF0aC5sb2cocGFnZXMpIC8gTWF0aC5sb2coMikpOyAvLyBmaW5kIGhvdyBtYW55IHBhZ2UgYml0cyAKCQlpbnQgb3RoZXJCaXRzID0gVklSVFVBTF9BRERSRVNTIC0gcGFnZUJpdHM7IC8vRmluZCB0aGUgb3RoZXIgYml0cwoJCQoJCWludCBwYWdlTnVtYmVyID0gKGFkZHJlc3MgPj4gb3RoZXJCaXRzKTsgLy8gYml0IHNoaWZ0IHRvIG9ubHkga2VlcCBwYWdlIGJpdHMgZm9yIHBhZ2UgbnVtYmVyCgkJaW50IG9mZnNldCA9IChhZGRyZXNzICYgKHBhZ2VTaXplIC0gMSkpOyAvLyBmaW5kIHRoZSBvZmZzZXQKCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBhZGRyZXNzICIgKyBhZGRyZXNzICsgIiBjb250YWluczoiKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oInBhZ2UgbnVtYmVyID0gIiArIHBhZ2VOdW1iZXIpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigib2Zmc2V0ID0gIiArIG9mZnNldCk7Cgl9Cn0K