落書きノート

ふと自分が気になった事を書いてます

C言語で問題を解く

解きながら学ぶC言語

解きながら学ぶC言語

// q7-8
#include <stdio.h>

int count_bits(unsigned x) {
  int count = 0;
  while(x) {
    if(x & 1U) count++;
    x >>= 1;
  }
  return count;
}

int int_bits(void) {
  return count_bits(~0U);
}

void print_bits(unsigned x) {
  int i;
  for(i = int_bits() - 1; i >= 0; i--)
    putchar(((x >> i) & 1U) ? '1' : '0');
}

unsigned set_n(unsigned x, int pos, int n) {
  int i;
  for(i = 0; i < n; i++) {
    unsigned t = x >> (pos - 1 + i) & 1U;
    x = t ? x : x | (1U << (pos - 1 + i));
  }
  return x;
}

unsigned reset_n(unsigned x, int pos, int n) {
  int i;
  for(i = 0; i < n; i++) {
    unsigned t = x >> (pos - 1 + i) & 1U;
    x = t ? x & ~(1U << (pos - 1 + i)) : x;
  }
  return x;
}

unsigned inverse_n(unsigned x, int pos, int n) {
  int i;
  for(i = 0; i < n; i++)
    x = x ^ 1U << (pos - 1 + i);
  return x;
}

int main(void) {
  unsigned x;
  int pos,no;
  printf("非負の整数xを入力してください : ");
  scanf("%u", &x);
  printf("操作するビット位置posを入力してください : ");
  scanf("%d", &pos);
  printf("操作するビット数noを入力してください : ");
  scanf("%d", &no);
  printf("x = ");
  print_bits(x);
  putchar('\n');
  printf("set_n(x, pos, no) = ");
  print_bits(set_n(x, pos, no));
  putchar('\n');
  printf("reset_n(x, pos, no) = ");
  print_bits(reset_n(x, pos, no));
  putchar('\n');
  printf("inverse_n(x, pos, no) = ");
  print_bits(inverse_n(x, pos, no));
  putchar('\n');
  return 0;
}