A solution to the three different ways to solve the Josephus problem

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
        for (int i = 1; i < 21; i++) {
            System.out.println(josephus1(i));    // print out the first 20 josephi (note the pattern)        
        }
    }

    public static void populateList(ArrayList<Integer> alist, int n) {
        for (int i = 1; i <= n; i++) {
            alist.add(i);
        }
    }
    
    public static int josephus1(int n) {
        ArrayList<Integer> knights = new ArrayList<Integer>();
        populateList(knights, n);
        System.out.println(knights);        
        
        int index = 1;   // skip over knight at position 0 to start
        while (knights.size() > 1) {  // more than one knight remains, so must kill another
            knights.remove(index);
            index = (index + 1) % knights.size();  // Go back to start of list of size exceeded
        }
        
        return knights.get(0);
    }
    
    public static int josephus2(int n) {            // Example: 91
        String str = Integer.toBinaryString(n);     // 91 decimal = 1011011 binary
        str = str.substring(1) + str.charAt(0);     // circularLeftShift(1011011) --> 0110111
        return Integer.parseInt(str,2);             // 110111 binary = 55 decimal 
    }

    public static int josephus3(int n) {                      // Example: 91
        int expt = (int) Math.floor(Math.log(n)/Math.log(2)); // 6 = log2(64) < log2(91) < log2(128) = 7
        int divisor = (int) Math.pow(2, expt);                // 2^6 = 64
        int remainder = n % divisor;                          // 91/64 = 1 R 27
        return 2 * remainder + 1;                             // 2 * 27 + 1 = 55 (the survivor)
    }    
}