1. 無料アクセス解析

プログラミングに没頭しているあるIT技術者の日々

プログラミングに関する技術やコードについて、日々思ったことを書いていくブログです。

C言語PART146 指定した数のビット目から指定した数のビット個数分1や0や反転して表示

#include

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);
}

unsigned set_n(unsigned x,int pos,int n){
int a,b,i;
unsigned c;

c = x;
a = pos;

for(i = pos;n > 0 && i > 0;n--,i--){
b = 2;
pos = i;
if (!(x >> --a) & 1U){
switch(i){
case 1: c += 1; break;
case 2: c += 2; break;
default: while(pos-- > 2){
b *= 2;
}
c += b;
}
}
}
return c;
}

unsigned reset_n(unsigned x,int pos,int n){
int a,b,i;
unsigned c;

c = x;
a = pos;

for(i = pos;n > 0 && i > 0;n--,i--){
b = 2;
pos = i;
if ((x >> --a) & 1U){
switch(i){
case 1: c -= 1; break;
case 2: c -= 2; break;
default: while(pos-- > 2){
b *= 2;
}
c -= b;
}
}
}
return c;
}

unsigned inverse_n(unsigned x,int pos,int n){
int a,b,i;
unsigned c;

c = x;
a = pos;

for(i = pos;n > 0 && i > 0;n--,i--){
b = 2;
pos = i;
if ((x >> --a) & 1U){
switch(i){
case 1: c -= 1; break;
case 2: c -= 2; break;
default: while(pos-- > 2){
b *= 2;
}
c -= b;
}
}else{
switch(i){
case 1: c += 1; break;
case 2: c += 2; break;
default: while(pos-- > 2){
b *= 2;
}
c += b;
}
}
}
return c;
}

void print_bits(unsigned x){
int i;

for(i = int_bits()-1;i >= 0;i--)
putchar(((x >> i) & 1U) ? '1' : '0');
}

int main(void){
unsigned a;
int b,c;

printf("非負の整数を入力してください:");
scanf("%u",&a);
printf("何ビット目から指定しますか:");
scanf("%d",&b);
printf("何個のビットを指定しますか:");
scanf("%d",&c);

printf("整数:"); print_bits(a);
printf("\n%dビット目から%d個を1にした値:",b,c); print_bits(set_n(a,b,c));
printf("\n%dビット目から%d個を0にした値:",b,c); print_bits(reset_n(a,b,c));
printf("\n%dビット目から%d個を反転した値:",b,c); print_bits(inverse_n(a,b,c));

putchar('\n');

return 0;
}


C言語 | コメント:0 | トラックバック:0 |

C言語PART145 指定した数のビット目を1や0や反転して表示

#include

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);
}

unsigned set(unsigned x,int pos){
int a,b = 2;
unsigned c;

c = x;
a = pos;

if ((x >> --a) & 1U){
return c;
}else{
switch(pos){
case 1: return c + 1;
case 2: return c + 2;
default: while(pos-- > 2)
b *= 2;
return c + b;
}
}
}

unsigned reset(unsigned x,int pos){
int a,b = 2;
unsigned c;

c = x;
a = pos;

if ((x >> --a) & 1U){
switch(pos){
case 1: return c - 1;
case 2: return c - 2;
default: while(pos-- > 2)
b *= 2;
return c - b;
}
}else{
return c;
}
}

unsigned inverse(unsigned x,int pos){
int a,b = 2;
unsigned c;

c = x;
a = pos;

if ((x >> --a) & 1U){
switch(pos){
case 1: return c - 1;
case 2: return c - 2;
default: while(pos-- > 2)
b *= 2;
return c - b;
}
}else{
switch(pos){
case 1: return c + 1;
case 2: return c + 2;
default: while(pos-- > 2)
b *= 2;
return c + b;
}
}
}

void print_bits(unsigned x){
int i;

for(i = int_bits()-1;i >= 0;i--)
putchar(((x >> i) & 1U) ? '1' : '0');
}

int main(void){
unsigned a;
int b;

printf("非負の整数を入力してください:");
scanf("%u",&a);
printf("何ビット目を指定しますか:");
scanf("%d",&b);

printf("整数:"); print_bits(a);
printf("\n%dビット目を1にした値:",b); print_bits(set(a,b));
printf("\n%dビット目を0にした値:",b); print_bits(reset(a,b));
printf("\n%dビット目を反転した値:",b); print_bits(inverse(a,b));

putchar('\n');

return 0;
}

C言語 | コメント:0 | トラックバック:0 |

C言語PART144 符号無し整数を左右にnビット回転した値を表示

かなり久しぶりになってしまいましたが、勿論止めるつもりはありません。

ただ今後は、毎日書くのはさすがに厳しくなってきたので、不定期になってしまう事だけはご了承頂ければと思います。

#include

unsigned rrotate(unsigned a,int b){

unsigned c,d;

c = a >> b;
d = a << int_bits()-b;

return c | d;
}

unsigned lrotate(unsigned a,int b){

unsigned c,d;

c = a << b;
d = a >> int_bits()-b;

return c | d;
}

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');
}

int main(void){
unsigned a;
int b;

printf("非負の整数を入力してください:");
scanf("%u",&a);
printf("何ビット回転しますか:");
scanf("%d",&b);

printf("整数:"); print_bits(a);
printf("\n右に%dビット回転した値:",b); print_bits(rrotate(a,b));
printf("\n左に%dビット回転した値:",b); print_bits(lrotate(a,b));

putchar('\n');

return 0;
}

C言語 | コメント:0 | トラックバック:0 |

C言語PART143 ビットのシフトと2のべき乗の関係を調べる

昨日やってないので今日は2件の予定なんですが、2件目がかなり時間がかかりそうなので、申し訳ないですが今日は1件だけにしておきます。

#include

void right_bit_shift(unsigned a,int b){

int i;
unsigned c = a;
for(i = 0;i < b;i++)
c /= 2;

if(a >> b == c)
printf("a >> bは等しい\n");
else
printf("等しくない\n");
}

void left_bit_shift(unsigned a,int b){

int j;
unsigned d = a;
for(j = 0;j < b;j++)
d *= 2;

if(a << b ==d)
printf("a << bは等しい\n");
else
printf("等しくない\n");
}

int main(void){

unsigned a;
int b;

puts("符号無し整数値とシフトするビット数を入力してください。");
printf("符号無し整数値:"); scanf("%u",&a);
printf("シフトするビット数:"); scanf("%d",&b);

right_bit_shift(a,b);
left_bit_shift(a,b);
return 0;
}

C言語 | コメント:0 | トラックバック:0 |

C言語PART142 unsigned型を左右にシフトした値を表示

こちらはコードは読みやすくなったものの、頭の切り替えが上手くいかず答えを見る結果に・・・。

見た瞬間「ああ〜そういうことかよ〜」と叫びました(笑)

結構、ビット関係のプログラムって難しいです・・・。

#include

int count_bits(unsigned x){ //xのビット列に1が幾つ含まれているか調べる
int count = 0;
while(x){
if(x & 1U) count++; //xの最下位ビットが1だったらcountを増やす
x >>= 1; //xを右に1ビットシフトし、それをxに代入
}
return count; //unsigned型のビット列の数を返す(gccだと32だった)
}

int int_bits(void){
return count_bits(~0U); //ビット列を全て1に反転する
}

void print_bits(unsigned x){
int i;

for(i = int_bits()-1;i >= 0;i--)
putchar(((x >> i) & 1U) ? '1' : '0'); //xを31〜0まで1ずつ右シフトしていき最下位ビット列の値を調べていく
}

int main(void){
unsigned a;
int b;

printf("非負の整数を入力してください:"); scanf("%u",&a);
printf("何ビットシフトしますか:"); scanf("%d",&b);

printf("\n整数       = "); print_bits(a);
printf("\n左にシフトした値 = "); print_bits(a << b);
printf("\n右にシフトした値 = "); print_bits(a >> b);
putchar('\n');

return 0;
}

C言語 | コメント:0 | トラックバック:0 |

C言語PART141 unsigned型の論理積・論理和・排他的論理和・1の補数を表示

かなり苦戦しましたが、一応答えを見ずに出来ました。ただ、コードが汚い・・・。

#include

int count_bits(unsigned x){ //xのビット列に1が幾つ含まれているか調べる
int count = 0;
while(x){
if(x & 1U) count++; //xの最下位ビットが1だったらcountを増やす
x >>= 1; //xを右に1ビットシフトし、それをxに代入
}
return count; //unsigned型のビット列の数を返す(gccだと32だった)
}

int int_bits(void){
return count_bits(~0U); //ビット列を全て1に反転する
}

void print_bits(unsigned x){
int i;

for(i = int_bits()-1;i >= 0;i--)
putchar(((x >> i) & 1U) ? '1' : '0'); //xを31〜0までずつ右シフトしていき最下位ビット列の値を調べていく
}

int main(void){
unsigned a,b; //符号なしの単なるint型
int i;

puts("二つの非負の整数を入力してください。");
printf("整数A:"); scanf("%u",&a);
printf("整数B:"); scanf("%u",&b);
putchar('\n');

printf("A = ");
print_bits(a);
putchar('\n');
printf("B = ");
print_bits(b);
putchar('\n');
printf("A & B = ");
print_bits(a & b);
putchar('\n');
printf("A | B = ");
print_bits(a | b);
putchar('\n');
printf("A ^ B = ");
print_bits(a ^ b);
putchar('\n');
printf("~A = ");
print_bits(~a);
putchar('\n');
printf("~B = ");
print_bits(~b);
putchar('\n');

return 0;
}

C言語 | コメント:0 | トラックバック:0 |

C言語PART140 unsigned型のビット構成を表示

ちょっとクセがあって本を見ないと解けませんでした。演算子を忘れていた。

#include

int count_bits(unsigned x){ //xのビット列に1が幾つ含まれているか調べる
int count = 0;
while(x){
if(x & 1U) count++; //xの最下位ビットが1だったらcountを増やす
x >>= 1; //xを右に1ビットシフトし、それをxに代入
}
return count; //unsigned型のビット列の数を返す(gccだと32だった)
}

int int_bits(void){
return count_bits(~0U); //ビット列を全て1に反転する
}

void print_bits(unsigned x){
int i;
for(i = int_bits() -1;i >= 0;i--) //unsigned型のビット列の数の(最大値-1)から1ずつ減らしていく
putchar(((x >> i) & 1U) ? '1' : '0'); //xを31〜0までずつ右シフトしていき最下位ビット列の値を調べていく
}

int main(void){
unsigned nx; //符号なしの単なるint型

printf("非負の整数を入力してください:");
scanf("%u",&nx);

print_bits(nx);
putchar('\n');

return 0;
}

C言語 | コメント:0 | トラックバック:0 |

C言語PART139 型の大きさ(バイト数)を表示する

#include

int main(void){

printf("sizeof(char) = %d\n",sizeof(char));
printf("sizeof(short) = %d\n",sizeof(short));
printf("sizeof(int)  = %d\n",sizeof(int));
printf("sizeof(long) = %d\n",sizeof(long));

return 0;
}

C言語 | コメント:0 | トラックバック:0 |

C言語PART138 "ただの"char型が符号有りか無しか調べる

gccでの結果は"符号有り"でした。

#include stdio.h
#include limits.h //← これ忘れないように

int main(void){

if(CHAR_MIN)
printf("この処理系のchar型は符号有りです。\n");
else
printf("この処理系のchar型は符号無しです。\n");
return 0;
}

C言語 | コメント:0 | トラックバック:0 |

C言語PART137 暗黙の初期化を確認

#include

int a[2];
int b;

int main(void){

static int c[2];
static int d;
int e[2];
int f;
int i;

for(i = 0;i < 2;i++){
printf("a = %d\n",a[i]);
printf("b = %d\n",b);
printf("c = %d\n",c[i]);
printf("d = %d\n",d);
printf("e = %d\n",e[i]);
printf("f = %d\n",f);
}
return 0;
}

C言語 | コメント:0 | トラックバック:0 |
| HOME | NEXT