using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.Intrinsics.X86; class Program { static int NN => int.Parse(ReadLine()); static long[] NList => ReadLine().Split().Select(long.Parse).ToArray(); public static void Main() { Solve(); } static void Solve() { var t = NN; var ans = new long[t]; for (var u = 0; u < t; ++u) { var c = NList; ans[u] = Move(c[0], c[1]); } WriteLine(string.Join("\n", ans)); } static long Move(long m, long d) { --d; var b = new int[62]; var end = 0; for (var i = 0; i < b.Length; ++i) { b[i] = (int)((m >> i) & 1); if (b[i] == 1) end = i; } var ans = 0L; for (var i = end - 1; i > d; --i) { if (b[i] == 0) { var cur = (int[])b.Clone(); var pos = (int)d; while (pos < i) { if (cur[pos + 1] == 1) { var next = Next(cur); if (next[pos + 1] == 1) { ++pos; ++ans; cur = next; } else { ++pos; ++ans; } } else { var next = NextOne(pos + 1, cur); ++pos; ans += Num(next) - Num(cur); cur = next; } } return ans + Num(cur) - 1; } } return Num(b) - 1; } static int[] Next(int[] org) { var next = (int[])org.Clone(); for (var i = 0; i < next.Length; ++i) { if (next[i] == 0) { next[i] = 1; break; } else next[i] = 0; } return next; } static int[] NextOne(int d, int[] org) { var next = Next(org); if (next[d] == 1) return next; for (var i = 0; i < d; ++i) next[i] = 0; next[d] = 1; return next; } static bool Equals(int[] a, int[] b) { for (var i = 0; i < a.Length; ++i) { if (a[i] != b[i]) return false; } return true; } static long Num(int[] a) { var ans = 0L; for (var i = a.Length - 1; i >= 0; --i) ans = ans * 2 + a[i]; return ans; } }