Bit Manipulation
C++
#include <bitset>
#include <string>
using namespace std;
using ll = long long;
bool get_bit(ll n, ll i) {
  return (n & (1LL << i)) != 0;
}
ll set_bit(ll n, ll i) {
  return n | (1LL << i);
}
ll toggle_bit(ll n, ll i) {
  return n ^ (1LL << i);
}
ll clear_bit(ll n, ll i) {
  ll mask = ~(1LL << i);
  return n & mask;
}
ll clear_bits_msb_though_i(ll n, ll i) {
  ll mask = (1LL << i) - 1;
  return n & mask;
}
ll clear_bits_i_through_0(ll n, ll i) {
  ll mask = -1LL << (i + 1);
  return n & mask;
}
ll update_bit(ll n, ll i, bool i_th_bit) {
  ll mask = ~(1LL << i);
  return (n & mask) | (i_th_bit << i);
}
int main() {
  ll n = 7;
  bitset<4> before(n);
  bitset<4> b(get_bit(n, 2));
  puts(before.to_string().c_str()); // 0111
  printf("%d\n", get_bit(n, 2));    // 1
  puts("");
  bitset<4> after1(set_bit(n, 3));
  puts(before.to_string().c_str()); // 0111
  puts(after1.to_string().c_str()); // 1111
  puts("");
  bitset<4> after2(toggle_bit(n, 1));
  puts(before.to_string().c_str()); // 0111
  puts(after2.to_string().c_str()); // 0101
  puts("");
  bitset<4> after3(clear_bit(n, 1));
  puts(before.to_string().c_str()); // 0111
  puts(after3.to_string().c_str()); // 0101
  puts("");
  bitset<4> after4(clear_bits_msb_though_i(n, 2));
  puts(before.to_string().c_str()); // 0111
  puts(after4.to_string().c_str()); // 0011
  puts("");
  bitset<4> after5(clear_bits_i_through_0(n, 1));
  puts(before.to_string().c_str()); // 0111
  puts(after5.to_string().c_str()); // 0100
  puts("");
  bitset<4> after6(update_bit(n, 1, 0));
  puts(before.to_string().c_str()); // 0111
  puts(after6.to_string().c_str()); // 0101
  puts("");
}