- ベストアンサー
c言語、演算子&について
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>&の後の-10はどのように理解すればよいのでしょうか? (intを16bitとします) 「10」は16進数で「000A」、「-10」は16進数で「FFF6」となります。 従って「0000 0000 0000 1010」と「1111 1111 1111 0110」 の論理積を取ることになり、結果は「2」となります。
その他の回答 (5)
- osamuy
- ベストアンサー率42% (1231/2878)
ある整数値とその数のマイナスにしたものとのビット積は、1の桁からみて最初にビットが1となる数を表す――という小技を示すプログラムかも。 例)10=0b1010だと最初に1がたつ値は2=0b10。 100=0b1100100だと、4=0b100。 それぞれのビットが何らかの条件を表してるとき、条件成立しているものを(ひとつだけ)一発で取り出すのに使えるという。
お礼
御回答ありがとうございますm(_ _)m なるほど~そういう使い方もできますね(゜Д゜) 何となくロボットとかで使えそうですね。 ありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
> &の後の-10はどのように理解すればよいのでしょうか? どのようにも何も、int型の整数定数であり、&演算子の右オペランドです。 なお、符号付き整数型をオペランドとするビット単位の演算子の結果は処理系定義です。
お礼
御回答ありがとうございますm(_ _)m かなり初歩的な質問だったようですね(^^;) 勉強不足でした。 ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
「&」はビット演算子です. 論理演算子「&&」とは区別してください. -2 は「false」ではありませんよ>#3.
お礼
御回答ありがとうございますm(_ _)m ふ~む、ビット演算子と論理演算子に区別があったのですね~(^^;) ありがとうございました。
- 1108435
- ベストアンサー率43% (94/217)
基本的に間違いのプログラムですから、考えないほうが良いとは思いますけどね。 &は確かに論理積を求める演算子ですから式中にある j = i & -10;(変数と演算子の間にスペースを入れるとソースが見やすくなります) の結果になりますから、jはiと-10の値の論理積の結果ということになりますね。 もちろんこのときjの宣言を論理型にしておけばjはfalseになると思います。
お礼
御回答ありがとうございますm(_ _)m 実はこれ私が書いたプログラムなんです。 お恥ずかしい限りです(^^;) ソースの書き方など勉強になりました。 ありがとうございました。
- D-Matsu
- ベストアンサー率45% (1080/2394)
&は「ビット論理積」です。 ビット演算に関する知識がないと説明がやや面倒なのですが、 iは10ですから2進表記(8桁)で00001010、-10は11110110となります。 これを各桁でANDを取っていくと、 00001010 11110110 -------- 00000010 となります。 普通は10進表記で「-10」なんて書かずに、基数変換しやすい16進表記で「0xFFF6」とか書くんですけどね……
お礼
御回答ありがとうございますm(_ _)m 今後は基数変換しやすい表記を用いることにします(^_^)/ ありがとうございました。
関連するQ&A
- 演算子がわかりません。
最近、Cの勉強を始めたばかりの素人です。以下を実行すると、出力が45になります。iが6になって、jが9になり、掛けるだけなので54になると思うのですが、恥ずかしいことに私の理解力が足りないようです。 お手数ですが、どなたか分かりやすく教えて頂けませんでしょうか。 #include <stdio.h> int main(void) { int i = 5, j = 10, k; k = i++ * --j; printf("%d\n", k); return 0; }
- ベストアンサー
- C・C++・C#
- C言語のreturnの使い方
return a, b; のように2つの引数で値を返せることを最近になり 知りました。ところで以下のような使い方は可能でしょうか? test( , )という2つの引数が必要な関数にnum()で return 1,2としてひとつの関数呼び出しで引数2個分に すると言うようなことです。 #include <stdio.h> int test( int i, int j){ printf("%d %d",i,j); } int num(void){ return 1,2; } int main(void){ test( num() ); }
- ベストアンサー
- C・C++・C#
- 現在、私はC言語を学んでいます。
現在、私はC言語を学んでいます。 プログラミングの初期の初期の問題なんですが、 「Hello World」という有名なプログラムがありますよね? それについての質問です。 #include<stdio.h> main() { printf("Hello World"); return 0; } も #include<stdio.h> main(void) { printf("Hello World"); return 0; } も #include<stdio.h> int main() { printf("Hello World"); } もちゃんと表示できます。 ここで質問です。 int main(void) int main() main() main(void) はどう違うんですか? あと、 return 0; はあっても無くてもいいようなんですが どういう意味があるんでしょうか?
- ベストアンサー
- その他(インターネット・Webサービス)
- C言語プログラミングについて
#include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?
- ベストアンサー
- その他([技術者向] コンピューター)
- C言語 エラー表示 break の位置が誤っている(関数 main )
#include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓
- ベストアンサー
- C・C++・C#
- 再帰について(C言語)
今、再帰処理を勉強しています。 しかし、以下のプログラムがどうしても理解できません。 流れ的には一体どういう手順になっているのでしょうか? return i * fact( i - 1 )の部分を考えると頭が こんがらがってしまいます。 #include <stdio.h> int main( void ){ printf("5の階乗は %d です", fact(5) ); return 0; } int fact( int i ){ if( i == 1 ) return 1; else return i * fact( i - 1 ); } --------実行結果---------- 5の階乗は 120 です
- ベストアンサー
- C・C++・C#
- C言語、行列の積を求めるプログラムについて
「次に示す行列x,yの積を求めるプログラムを作成せよ。 x[2][3]={{1,2,3},{4,5,6}} y=[3][2]={{1,5},{5,3},{81}}」 という問題です。自分ではとりあえず、 #include<stdio.h> int main(void) { int i,j; int x[2][3]={{1,2,3},{4,5,6}}; int y[3][2]={{1,5},{5,3},{8,1}}; int xy[3][3]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) xy[i][j]=x[i][j]*y[i][j]; for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%3d",xy[i][j]); putchar('\n'); } return 0; } というプログラムを作ってみましたが、ダメでした。 ちゃんと積の表示が出るようにするにはどこをどう変えるべきでしょうか?
- ベストアンサー
- C・C++・C#
- C言語の2次配列
4行5列の配列を用意し、その配列の要素をtij(i=1~4, j=1~5)とするとき、tij=i×j となるように配列に値を入れ、 それを表の形で画面に表示するプログラムを作りなさい。 という問題なんですが、自分は下の様に組みましたがうまく動きません。どこが悪いのか教えてください。よろしくお願いします。あまりC言語を理解していないので申し訳ないですが、なるべく簡単に教えて頂ければ幸いです。 #include<stdio.h> int main(void) { int i,j; int t[4][5]; for(i=0;i<=3;i++) { for(j=0;j<=4;j++) t=i*j; printf("%5d",t); printf("\n"); } return 0; }
- ベストアンサー
- C・C++・C#
- c言語のプログラミングについて聞きたいのですが
自分は課題で「10人分の名前と点数を入力して降順に並び替える」というプログラムを作ろうとしているのですが、なかなかうまくいきません。一応↓の形までできたのですがなぜか数字が変になります。 どうしてか教えていただけないでしょうか。 #include<stdio.h> int main(void) { int i,j; int tensu[10][3]; char namae[10][6]; for(i=0;i<10;i++){ printf("名前の入力>>"); scanf("%s",&namae[i]); printf("点数の入力>>"); scanf("%d",tensu[i]); } printf("名前 点数\n"); for(j=0;j<10;j++) { printf("%s ",&namae[j]); printf("%10d\n",tensu[j]); } return 0; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください
- 締切済み
- C・C++・C#
- エラー C言語 プログラミングについて
#include<stdio.h> int leapYear(int); int main(void){ int year,i; for(i=2001;i=2999;i++){ year=i; printf("%d leap = %d \n",i,leapYear(int year)); return 0; } } int leapYear(int year){ if(year%100==0){ return 0; } else if(year%400==0){ return 1; } else if(year%4==0 && year%100!=0){ return 1; } } をコンパイルすると11行目に式の構文エラーが出るんですが どうしてでしょうか?? 間違ってない気がするんですけど。。
- 締切済み
- C・C++・C#
お礼
御回答ありがとうございますm(_ _)m なるほど~16進数はマイナス表現ができるのですね。 知りませんでした(^^;) おかけで理解できました。 ありがとうございました。