public class Main
{
public static void main
(String[] args
) { for (int i = 65535; i < 65545; i++) {
i
+ ": " + getBinaryPalindrom
(i
) + " = " + Integer.
toBinaryString(getBinaryPalindrom
(i
))); }
}
public static int getBinaryPalindrom(int N) {
if (N < 4) {
switch (N) {
case 1:
return 0;
case 2:
return 1;
case 3:
return 3;
}
}
// second highest to keep the right length (highest is always 1)
final int bitAfterHighest
= (N
>>> (Integer.
SIZE - Integer.
numberOfLeadingZeros(N
) - 2)) & 1; // now remove the second highest bit to get the left half of our palindrom
final int leftHalf
= (((N
>>> (Integer.
SIZE - Integer.
numberOfLeadingZeros(N
) - 1)) & 1) << (Integer.
SIZE - Integer.
numberOfLeadingZeros(N
) - 2)) | ((N
<< (Integer.
numberOfLeadingZeros(N
) + 2)) >>> (Integer.
numberOfLeadingZeros(N
) + 2)); // right half is just the left reversed
final int rightHalf
= Integer.
reverse(leftHalf
); }
if (bitAfterHighest == 0) {
// First uneven-length palindromes
return (leftHalf
<< (Integer.
SIZE - Integer.
numberOfLeadingZeros(leftHalf
)) - 1) | (rightHalf
>>> Integer.
numberOfTrailingZeros(rightHalf
)); } else {
// Then even-length palindromes
return (leftHalf
<< (Integer.
SIZE - Integer.
numberOfLeadingZeros(leftHalf
))) | (rightHalf
>>> Integer.
numberOfTrailingZeros(rightHalf
)); }
}
}
cHVibGljIGNsYXNzIE1haW4KewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgZm9yIChpbnQgaSA9IDY1NTM1OyBpIDwgNjU1NDU7IGkrKykgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKICAgICAgICAgICAgICAgIGkgKyAiOiAiICsgZ2V0QmluYXJ5UGFsaW5kcm9tKGkpICsgIiA9ICIgKyBJbnRlZ2VyLnRvQmluYXJ5U3RyaW5nKGdldEJpbmFyeVBhbGluZHJvbShpKSkpOwogICAgfQp9CgpwdWJsaWMgc3RhdGljIGludCBnZXRCaW5hcnlQYWxpbmRyb20oaW50IE4pIHsKICAgIGlmIChOIDwgNCkgewogICAgICAgIHN3aXRjaCAoTikgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIHJldHVybiAzOwogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiWW91IG5lZWQgdG8gc3VwcGx5IE4gPj0gMSIpOwogICAgfQogICAgLy8gc2Vjb25kIGhpZ2hlc3QgdG8ga2VlcCB0aGUgcmlnaHQgbGVuZ3RoIChoaWdoZXN0IGlzIGFsd2F5cyAxKQogICAgZmluYWwgaW50IGJpdEFmdGVySGlnaGVzdCA9IChOID4+PiAoSW50ZWdlci5TSVpFIC0gSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyhOKSAtIDIpKSAmIDE7CiAgICAvLyBub3cgcmVtb3ZlIHRoZSBzZWNvbmQgaGlnaGVzdCBiaXQgdG8gZ2V0IHRoZSBsZWZ0IGhhbGYgb2Ygb3VyIHBhbGluZHJvbQogICAgZmluYWwgaW50IGxlZnRIYWxmID0gKCgoTiA+Pj4gKEludGVnZXIuU0laRSAtIEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3MoTikgLSAxKSkgJiAxKSA8PCAoSW50ZWdlci5TSVpFIC0KICAgICAgICAgICAgSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyhOKSAtIDIpKSB8ICgoTiA8PCAoSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyhOKSArIDIpKSA+Pj4gKEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3MoTikgKyAyKSk7CiAgICAvLyByaWdodCBoYWxmIGlzIGp1c3QgdGhlIGxlZnQgcmV2ZXJzZWQKICAgIGZpbmFsIGludCByaWdodEhhbGYgPSBJbnRlZ2VyLnJldmVyc2UobGVmdEhhbGYpOwogICAgaWYgKEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3MobGVmdEhhbGYpIDwgSW50ZWdlci5TSVpFIC8gMikgewogICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJUbyBiaWcgdG8gZml0IE49IiArIE4gKyAiIGludG8gYW4gaW50Iik7CiAgICB9CiAgICBpZiAoYml0QWZ0ZXJIaWdoZXN0ID09IDApIHsKICAgICAgICAvLyBGaXJzdCB1bmV2ZW4tbGVuZ3RoIHBhbGluZHJvbWVzCiAgICAgICAgcmV0dXJuIChsZWZ0SGFsZiA8PCAoSW50ZWdlci5TSVpFIC0gSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyhsZWZ0SGFsZikpIC0gMSkgfCAocmlnaHRIYWxmCiAgICAgICAgICAgICAgICA+Pj4gSW50ZWdlci5udW1iZXJPZlRyYWlsaW5nWmVyb3MocmlnaHRIYWxmKSk7CiAgICB9IGVsc2UgewogICAgICAgIC8vIFRoZW4gZXZlbi1sZW5ndGggcGFsaW5kcm9tZXMKICAgICAgICByZXR1cm4gKGxlZnRIYWxmIDw8IChJbnRlZ2VyLlNJWkUgLSBJbnRlZ2VyLm51bWJlck9mTGVhZGluZ1plcm9zKGxlZnRIYWxmKSkpIHwgKHJpZ2h0SGFsZgogICAgICAgICAgICAgICAgPj4+IEludGVnZXIubnVtYmVyT2ZUcmFpbGluZ1plcm9zKHJpZ2h0SGFsZikpOwogICAgfQp9Cn0=