C言語PART146 指定した数のビット目から指定した数のビット個数分1や0や反転して表示2008-06-01 Sun 20:03
#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言語PART145 指定した数のビット目を1や0や反転して表示2008-06-01 Sun 20:00
#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言語PART144 符号無し整数を左右にnビット回転した値を表示2008-06-01 Sun 19:56
かなり久しぶりになってしまいましたが、勿論止めるつもりはありません。
ただ今後は、毎日書くのはさすがに厳しくなってきたので、不定期になってしまう事だけはご了承頂ければと思います。 #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言語PART143 ビットのシフトと2のべき乗の関係を調べる2008-05-08 Thu 19:59
昨日やってないので今日は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言語PART142 unsigned型を左右にシフトした値を表示2008-05-06 Tue 09:31
こちらはコードは読みやすくなったものの、頭の切り替えが上手くいかず答えを見る結果に・・・。
見た瞬間「ああ〜そういうことかよ〜」と叫びました(笑) 結構、ビット関係のプログラムって難しいです・・・。 #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言語PART141 unsigned型の論理積・論理和・排他的論理和・1の補数を表示2008-05-06 Tue 09:28
かなり苦戦しましたが、一応答えを見ずに出来ました。ただ、コードが汚い・・・。
#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言語PART140 unsigned型のビット構成を表示2008-05-05 Mon 05:48
ちょっとクセがあって本を見ないと解けませんでした。演算子を忘れていた。
#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言語PART139 型の大きさ(バイト数)を表示する2008-05-03 Sat 23:25
#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言語PART138 "ただの"char型が符号有りか無しか調べる2008-05-02 Fri 21:00
gccでの結果は"符号有り"でした。
#include stdio.h #include limits.h //← これ忘れないように int main(void){ if(CHAR_MIN) printf("この処理系のchar型は符号有りです。\n"); else printf("この処理系のchar型は符号無しです。\n"); return 0; } |
C言語PART137 暗黙の初期化を確認2008-05-01 Thu 21:37
#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; } |



