情報処理技術者試験の内容なんですが、やり方も理解できず悩んでいます。教えてください。

その1.
2の補数を使って解きなさい
  0110
 -)0111
------------

その2.
次の2進数は2の補数であらわした負の値である。符号付きの10進数に変換しなさい。
 1) 1001
 2) 1010
 3) 1111
 4) 1000

その3.
次の10進数を2の補数(4ビット)に変換しなさい。
 1)-6
 2)-3
 3)-5
 4)-4

本を見ながら解いているのですがいまいち理解できません。お手数お掛けしますが、解る方がいらっしゃいましたら解説付で教えてくださると助かります!よろしくお願いいたします!

このQ&Aに関連する最新のQ&A

A 回答 (3件)

 ビット反転、2進数の加算、10進数への変換は分かるものとして書きます。



 まず「2の補数」ですが、例えば「ある数Aの2の補数」とは「Aを2進数で表して、全部の桁(ビット)を反転させたもの+1の値」になります。
 で、なぜそんなものを使うのかというと、「コンピュータの中では、負の数を2の補数で表しているから」です。
 つまり、ある数Aの2の補数とは「-A」のことで、「2の補数を求める」とは「符号を反転させる」ことなのです。
※負の値は、10進数では-記号を数字の頭につけて表しますが、2進数では一番上(左)の桁が1なら負として表します。
※ここまで、とても簡単に説明しているため、詳細は異なる部分もあります。

 では問題の方を。
■その1
 2進数の「1001 - 0111」という計算ですが、これは「1001 + (-0111)」と書くこともできるので、まず0111の2の補数を求めて、それを1001と足せばよいのです。
 加算の際、(0ビット目から数えて)4ビット目に繰り上がった値は捨て、結果に入れないで下さい。

■その2
 この問題は「-Aという形の10進数を、符号付2進数に変換してあるので、元の10進数に戻しなさい」というものです。
 つまりAの2の補数が、既に求めてあるわけです。
 従って、問題の値の2の補数を求めて10進数へ変換すればAが求まり、それに-記号をくっつけたのが答えになります。
※2の補数で表された2進数には、通常の10進数への変換方法を使うことができません。

■その3
 これは問題2の逆ですね。-記号を取った値を2進数に変換し、2の補数を求めればOKです。
 2進数に変換した時、どの値も2~3ビットで表せてしまいますが、頭に0を付け足して4ビットにしておいて下さい。それを全ビット反転させれば頭が1の2進数が求まりますよね。

 以上、こんなものでどうでしょうか?分からなければ補足に書いて下さい。
 一応、過去に補数に関して回答した時のものを、参考URLに載せておきます(No.4,5辺り)。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=82945
    • good
    • 0
この回答へのお礼

よくわかります!(本にはなんでこういう細かいわかりやすいことがのっていないのか?と思います。)参考になりました!有難うございます!もうちょっとがんばってみます。

お礼日時:2001/08/20 00:38

すみません。


 問題1の中で、「1001 - 0111」と書いてしまいましたが、これは「0110 - 0111」ですね。問題2-(1)と見間違いました。
 というわけで、加算中に桁上がりすりこともありませんでしたね。

 ついでに1個補足を入れておきますが、問題2-(4)の「1000」は、2の補数で表しても「1000」です。負数の2の補数を求めた場合、これは必ず正の数になるので、「1000」を素直に10進数に変換して、-記号をくっつけて下さい。

 さらにもう1個、pythianさんが問題2の説明の中で
>  補数を元に戻すには、1を引いて反転させるので、これは0111
とありますが、補数で表された値は、もう1度補数を求めれば元に戻りますので、やりやすい方を使って下さい。
    • good
    • 0

2の補数は、簡単に言えばビットをひっくりかえして1を足すことで導けます。



0110 - 0111の場合、10進だと6-7ですよね。ここで7を補数にします。ビットを反転させて1を足すと1001になります。これで、1001は-7を表すことになりました。次に、0110+1001をやってみます。1111ですね。これは-1の補数表示です。逆の手順で、1を引いて反転させると0001になりましたね。つまり、演算結果は-1です。何故こんなややこしいことをするのか、簡単に言えば、足し算の機能だけで引き算をするためです。

1) 1001
 補数を元に戻すには、1を引いて反転させるので、これは0111
2) 1010 -> 0110
3) 1111 -> 0001
4) 1000 -> 1000
となります。

10進の場合は、まず2進にしてから補数化します。
1)-6 6 -> 0110 -> 1001 -> 1010
2)-3 3 -> 0011 -> 1100 -> 1101
3)-5 5 -> 0101 -> 1010 -> 1011
4)-4 4 -> 0100 -> 1011 -> 1100

・・・間違いがあればバシバシ突っ込んでください。(^^;

補数を使えば、二進数で負の数を表すことができるようになります。そのまま足せば減算ができるんですね。ただし、限られたビット長で負を表すので、表すことの出来る正の数は半分になります。たとえば、8ビットだった場合、そのままなら256まで表せられますが、補数を使うと-128~127までになります。
    • good
    • 0
この回答へのお礼

有難うございます。。難しいですねぇ。。それにしても。教えてもらったことをもう一度確認しながらがんばってみます!有難うございました!

お礼日時:2001/08/20 00:37

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q日本円と人民元はレートの交換?はしていないのでしょうか?

いまいち為替の仕組みがよくわかっていませんが
http://www.gaitame.com/market/chart/usd_1.html
を見て思ったのですが
日本と中国では通貨の交換(この表現で合ってるか自信ないです)はしていないのでしょうか?
たまたま外為どっとコムがしていないだけなのでしょうか?

Aベストアンサー

日本円(JPY) から 中国 元(CNY) 為替レート2009 年 05 月 09 日
1 日本円 = 0.0693 中国 元
http://www.zzrate.com/rates/jpy/cny/1/

参考URL:http://www.zzrate.com/rates/jpy/cny/1/

Q2の補数について

情報処理試験(基本情報)用の考え方という前提でお聞きします。

「負数を2の補数形式で表現する2進数の計算で・・・・」という問題がよくあります。
この問題文の中で「10101」などの数(これは5ビットの符号付2進数とします)
として記述されているものは、もう2の補数になっていると考えていいのでしょうか?
それともこれを、今から2の補数に直すのですか?
(もし直すのであれば、最上位ビットの符号が変わるのでしょうか?)

違う言い方をしてみますと「A」の2の補数が「-A」だとしたら、
「-A」の2の補数は「A」になるんでしょうか?
それとも「そんな表現はない。-Aの時点ですでに2の補数だ」という
ことになるのでしょうか?

解りにくくてすみません。

Aベストアンサー

>問題文中の符号ビットが負数だったら、
>変換してしまうという考えでいいのでしょうか?
違います。計算過程で一時的に変換を行うのか、と言われればその通り、ということになりますが。
おそらく、手順としては正しく理解されており、言葉の用法が正しくないと思われます。

11010B=-11、という対応関係を見る際に2の補数を取っているのは、計算の便宜上のものであって、数自体を変換しているわけではありません。
x=10101Bがどの数に対応するのか、というのを調べる際には、次のように考えます。
但し、この議論は「負数を2の補数形式で表現する」場合の話です。
1.符号ビットが1なので、これは負の数として解釈しなければなりません。
2.ところが、負の数を表すビット列を直接数値に直すのは、慣れていないとなかなか難しい物があります。
3.そこで、-xがどの数に対応するのかが分かれば、xがどの数に対応するのかが分かる、というふうに考えます。
4.ビット列xから、-xを求めるには2の補数を取ればよいので、-x=01011Bとなります。
5.このビット列は11を表していますので、-x=11、が分かりました。
6.従ってx=-11です。
つまり、計算の過程で、計算の便宜上-xを算出するために2の補数を取って(-1倍して)いるに過ぎず、きちんと5→6の際に-1倍して元に戻しています。
数自体を変換しているわけではありません。

操作自体は理解されておられるようですから、あとは言葉の使い方の問題だと思われます。
一応、変換の手順を場合分けしておきます。(負数を2の補数で表現する場合)
・最上位ビット(符号ビット)が0のとき
素直に2進数を10進数に直せばOKです。
・符号ビットが1のとき
元の数をxとします。xを10進数に直すのは慣れが必要ですので、慣れのいらない場合に帰着させます。
つまり、-xを求めれば、それを-1倍してxを求められる、という考えをします。
xから-xを求めるには2の補数を取れば良いです。
こうして得られた結果は-xですから、最後に-1倍します。

ここで2の補数を取ってはいますが、後で-1倍するので、xの2の補数に対応する数を最終結果としているのではないことに注意してください。
つまり、この計算方法は「便宜上2の補数を利用している」のであって、「2の補数を取ったものを求めている」わけではありません。

次のようにも言うことができます。
・どんな場合でも与えられた数の2の補数を取ったものを求めて最終結果とする、ということはしない
・符号ビットが1の時には、2の補数=-1倍、という対応関係を計算の過程で利用する。つまり、2の補数を利用する
「2の補数を結果とする」と「計算過程で利用する」の言葉の違いを理解していただければ幸いです。
前者は「最後にマイナスを付ける」というニュアンスがありません。


ちなみに、負数を2の補数で表現する場合には、(オーバーフローしない場合には)10進に直してから足しても、ビット表現のままで2進数として足しても結果は同じになりますが、
負数を1の補数で表現する場合にはそのようなことは成り立ちません。

>問題文中の符号ビットが負数だったら、
>変換してしまうという考えでいいのでしょうか?
違います。計算過程で一時的に変換を行うのか、と言われればその通り、ということになりますが。
おそらく、手順としては正しく理解されており、言葉の用法が正しくないと思われます。

11010B=-11、という対応関係を見る際に2の補数を取っているのは、計算の便宜上のものであって、数自体を変換しているわけではありません。
x=10101Bがどの数に対応するのか、というのを調べる際には、次のように考えます。
但...続きを読む

Q人民元,ドル,円の為替関係の中で 円の損益分岐点は

7月13日現在
通貨種類   人民元   米ドル    日本円
人民元    1      8.277   0.07608
CNY 米ドル 0.1208     1     0.009192
USD 日本円  13.14    108.8     1
と なっていますが
人民元とドルの為替レートは固定されてますよね
円のレートで人民元に換金する時,いくらのレートまでだったら円が得でいくら以上だとドルが得か
計算書式もわからず 円の損益分岐教えてください。

Aベストアンサー

損益はありません。

利益の出る組み合わせがあったとしましょう。
すると、世界中の金融機関で為替レートの変動を監視しているコンピュータが
瞬時にそれを見つけ出し、資金を移動させようとします。相対的に高い通貨の
レートは下がり、安い通貨のレートは上がります。結果として、為替レートに
よる損益は解消されてしまうのです。

もちろん、通時的な変動によって差益を得ようとするのであれば、一応可能です。
安い時に買った通貨を高い時に売れば差益は出ます。ただ、相対的なものですので、
いくら以上なら得と言うことはできません。

Q2の補数の求め方

2の補数の求め方で、
・ビット反転して1を足す
・1を引いてビット反転
この2つの方法はどちらでもよいのてしょうか?

Aベストアンサー

どちらでもいいと思いますが、本来的な意味は、

補数をとりたい数の桁数より1桁多い

100...0

からその数を減ずることです。

Q円・ドル・元の関係について

最近、また人民元切り上げの話題が盛り上がってきましたね。外国為替証拠金取引でも人民元を取り扱っている業者もあるようです。個人でも切り上げで恩恵を受けることができないか考えています。

そこで質問です。

1.ドル/円レート 106.85円
2. 元/円レート  12.91円
3.ドル/元レート 8.2764元

上のレートで、1=2×3という式がおおよそ成り立ちます。

元が通貨バスケット制だか変動相場制だかに移行したら、3の値が小さくなるというのはわかるのですが、2の値はどうなるのでしょうか。元/円も変動相場制になるのでしょうか?この式がどのように変わっていくことが予想されるのか知りたいのです。

Aベストアンサー

1=2x3という式は不変で、いつの場合でも成立します。もし、ここから大きく外れると、無リスクの裁定取引ができるので為替ディーラーたちが取引を開始し、1=2x3に収束するようになります。

変動相場制に移行した場合でも、1=2×3は不変なので、2は3が大きくなるにつれ小さくなります。元が円に対しても強くなるわけです。

人民元がドルに対して強くなるだろうというのは確からしいとしても、それに向かう過程は一筋縄ではいかないのではと考えています。投機筋の大量の人民元買いや香港ドル買いが起こったら中国当局はどうするのでしょうかね。何らかの移行措置を考えないと、危険なことになると考えるはずでしょう。通貨バスケット制の場合は、人民元は切りあがるわけではないので、この方法を選択するのでしょうか。

私は、先行きがあまりにも不透明なので、やはり通貨それ自体に対する投資は控えたいと思っています。

Qverilog で「*」を使って2の補数形式の乗算って・・・

加算器、減算器 どうやらうまくいったようでやっと乗算器を作っています。それで早速質問ですが、2の補数形式を「*」をつかって作りたいのですが、次のようにやると文法エラーになってしまいます。
******************************
module mul(a,b,q);

input [15:0] a,b;
output [32:0] q;

reg [32:0] q;

always@(a or b)
begin
if((a == 16'h8000) || (b == 16'h8000))
$monitor("error");
else if((a[15] == 0) && (b[15] == 0))
q = a * b;
else if((a[15] == 0) && (b[15] == 1))
begin
q =a * (~b+1);
q = ~q+1;
end
else if((a[15] == 1) && (b[15] == 0))
begin
q =(~a+1) * b;
q = ~q+1;
end
elseif((a[15] == 1) && (b[15] == 1))
q = (~a + 1) * (~b + 1);
else
q = a * b;
end
endmodule
********************************
内容は
q = (~a + 1) * (~b + 1);
(mul.v,28|16): expecting a semicolon(';')
けれどどこが間違っているのか…
ちなみにalways@(a[15] or b[15])のように書き換えるとシミュレーションできるのですが、結果があっていません。
どなたか教えてくださいm(_ _)m

加算器、減算器 どうやらうまくいったようでやっと乗算器を作っています。それで早速質問ですが、2の補数形式を「*」をつかって作りたいのですが、次のようにやると文法エラーになってしまいます。
******************************
module mul(a,b,q);

input [15:0] a,b;
output [32:0] q;

reg [32:0] q;

always@(a or b)
begin
if((a == 16'h8000) || (b == 16'h8000))
$monitor("error");
else if((a[15] == 0) && (b[15] == 0))
...続きを読む

Aベストアンサー

最後の "else if" が "elseif" になっているためにエラーになるのでは。
でもそれだと、
>ちなみにalways@(a[15] or b[15])のように書き換えるとシミュレーションできるのですが、結果があっていません。
というのがわからないのですが。。。

ちなみに、上記のように記述を訂正してシミュレータ(Icarus Verilog)に
かけたところ通りました。結果はきちんと見ていませんが、それらしい値が
出ているようでした。

Q中国で日本円を人民元に両替

中国で日本円を人民元に両替をしたいと思います。
10万円以下ですが、どういった方法が一番良いレートで両替できるでしょうか?
闇両替はつかいません。

中国の銀行は日本円現金を両替する場合1万円ごとに10元以上の手数料が付くと聞いたのですが本当なのでしょうか?

以前中国でPLUSのついている国際カードで、ATMで日本の普通預金を引き落としいましたが1回の手数料日本円200円かかりますが、この手数料も加算して実際PLUSの換金レートはいかがなものなのでしょうか?とても便利で中国にいるときはよく利用してしまうのですが。。。。

やはりカードを利用するより銀行の窓口で両替した方が良いレートなのでしょうか?

よろしくお願いします。

Aベストアンサー

1万円あたり手数料が10元というのは聞いたことがありませんが、為替レートに対して通貨売りTTSと通貨買いTTBのレートが設定されているという話でしょうか。
実際、外貨から中国元に両替する場合、銀行口座に預金されている外貨から両替する場合と、外貨現金から両替する場合では、適用されるレートが異なります。
http://www.boc.cn/sourcedb/whpj/
は中国銀行の為替レート一覧です。現鈔が現金の場合のレートです。日本円(日元)の現金を中国元に両替する場合のレートは左から2列目のレートが適用されます。日本円の場合は100円を交換した場合に得られる中国元の額になっていますので、1万円を両替するとこの表の数字の100倍の額が手に入ります。(今だとおよそ600中国元です。)
日本の銀行で両替すると1中国元あたり1.5円ほどの手数料に相当するので、現地の銀行で両替するのが一番有利だと思います。

Q255の2の補数、B'00000001'が-255を表さない理由は

こんにちは。
8ビットマイコンで、
127=B'01111111'の2の補数
B'10000001'は-127を
表します。
しかし、8ビットマイコンで、
マイナスを扱うのは、-127~127で
先頭一桁は正負を表すので
使えない、と説明されています。
しかし、
255=B'11111111'の2の補数を、
B'00000001'を-255としても、
問題ないのでは、ないでしょうか。
両者を足せば、0になります。
先頭ビットを使ってはいけない理由は、
何でしょうか。
(127までなら、マイナスは先頭
ビットが、0になる。分類に便利、
というなら、分かりますが)。
何か分かる人がいましたら、
よろしくお願いします。

Aベストアンサー

 
00000001を-255とするなら「1」はどの様に表現する?

 

Q上海空港で円を元に両替し、帰りに上海か成田で元を円に両替しようと思います。

レートが20円/元とすると、10000円は何元の手取りになり①、全く使わず円に戻すと何円になるのでしょうか②?両替できる単位はどれほどでしょうか③。元は何元札を持てば一番便利でしょうか④?注意すべきこと、有利になることなど何でも教えてください⑤.海外は初めてです。

Aベストアンサー

① 国際線出口の両替所では両替1回毎に手数料60元を必要としますから、元買い為替レート20円=1元ならば、(10,000÷20)-60=540元となります。なお両替レート自体が中国銀行公定レートより悪いです。
② 中国内での再両替は6か月内の両替証明書金額の1/2までです。たとえ両替した元を全額使用しなくとも、この制限にかかり全額再両替は出来ません。なお、公式レートでは元売りの為替レートは元買いの為替レートより約0.5%低くなります。これが手数料になります。
③ 両替は通貨である紙幣単位です。円は千円から、元は1元からです。
④ 円から元への両替では100元札が基本です。スーパーやコンビニでは問題なく100元札で買い物できますから、そう気にする必要はありません。ただ、市内バスに頻繁に乗るなら、交通カード無しの場合、中国では無人バスではお釣りが出ませんから、運賃の1元札か硬貨を持つ必要があります。
⑤ 基軸通貨である米ドル・ユーロを除くと、現地両替が原則です。日本では10%以上レートが悪いのが一般的です。もし中国内での両替でしたら、市中の中国銀行での両替レートは公定レートで空港のような手数料無しなので問題ありませんが、場所探しと時間がかかります。

① 国際線出口の両替所では両替1回毎に手数料60元を必要としますから、元買い為替レート20円=1元ならば、(10,000÷20)-60=540元となります。なお両替レート自体が中国銀行公定レートより悪いです。
② 中国内での再両替は6か月内の両替証明書金額の1/2までです。たとえ両替した元を全額使用しなくとも、この制限にかかり全額再両替は出来ません。なお、公式レートでは元売りの為替レートは元買いの為替レートより約0.5%低くなります。これが手数料になります。
③ 両替は通貨である紙幣単位です。円は...続きを読む

Q進数変換のプログラムタイトルの由来

進数変換のプログラムのタイトルでは
dec2bin
dec2hex
bin2dec
bin2hex
hex2bin
hex2dec
などのタイトル名を聞きます
dec(10進),bin(2進),hex(16進)なのは分かるのですが、真ん中の"2"の意味がわかりません。このタイトルの由来を知っている方是非教えてください。

Aベストアンサー

英語の慣用表現で2=toです from dec to bin
forを4 youをuなどと書きます


人気Q&Aランキング

おすすめ情報