質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1288閲覧

C#のビット演算でNOT演算子をつかって出力すると1ではなく-1とでてしまう

MoruMoru_com

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/05/09 14:23

編集2022/05/10 00:21

https://paiza.jp/works/mondai/logical_operation/logical_operation__basic_step3/edit?language_uid=c-sharp
この問題をC#のビット演算で解こうとしています。
以下のように記述したのですが出力に-1と出てしまいます。
何故1と表示されないのかと1と表示する方法を教えてほしいです。

using System; class Program { static void Main() { var line = int.Parse(Console.ReadLine()); Console.WriteLine(~line); } }`

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/05/10 09:25

入力が 0 か 1 しかないという条件なら (入力 XOR 1) で良いのでは.
guest

回答2

0

ベストアンサー

■ 何故1と表示されないのか

int (System.Int32) は 32bit の符号付整数だからです。

0を2進数で表すと

0000 0000 0000 0000 0000 0000 0000 0000

これをビット反転すると

1111 1111 1111 1111 1111 1111 1111 1111

となり、10進では -1 になります。

■ 1と表示する方法

簡単にするなら、欲しいのは下位1ビットなので 1 と AND を取るのが良いかと思います。

C#

1static void Main(string[] args) { 2 var line = int.Parse(Console.ReadLine()); 3 Console.WriteLine(~line & 1); 4}

お遊びですが、0 と 1 しか代入できないクラスを作り、NOT 演算子をオーバーロードするのも面白いかも。

C#

1public class BIT 2{ 3 int value = 0; 4 5 private BIT(int value) { 6 switch (value) { 7 case 0: 8 case 1: 9 this.value = value; 10 break; 11 default: 12 throw new ArgumentOutOfRangeException(); 13 } 14 } 15 16 public override bool Equals(object obj) { 17 return value.Equals(obj); 18 } 19 20 public override int GetHashCode() { 21 return value.GetHashCode(); 22 } 23 24 public override string ToString() { 25 return value.ToString(); 26 } 27 28 public static implicit operator BIT(int value) { 29 return new BIT(value); 30 } 31 32 public static BIT operator ! (BIT value) { 33 return ~value.value & 1; 34 } 35} 36 37static void Main(string[] args) { 38 BIT line = int.Parse(Console.ReadLine()); 39 Console.WriteLine(!line); 40}

投稿2022/05/09 18:41

編集2022/05/09 19:21
KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MoruMoru_com

2022/05/15 04:28

返信大変遅れましたが回答ありがとうございました。
guest

0

~という演算子はNOTではなく、ビット反転です
ちゃんとNOTを使いましょう

投稿2022/05/09 14:56

編集2022/05/09 15:00
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/05/09 21:30

NOT って何ですか? どうやったら使えますか?
y_waiwai

2022/05/09 23:02

にほんごでいうと、ろんりひていえんざんしというものですね。 ちょっとむずかしかったですね
Zuishin

2022/05/09 23:09

で、どうやったらつかえますか?_
Zuishin

2022/05/09 23:10

もちろんろんりひていえんざんしのたいしょうは bool ということはしってますよね?
y_waiwai

2022/05/09 23:27

えーと、boolとintのへんかんがわからないってはなしかな?
Zuishin

2022/05/09 23:29

やってみてください
Zuishin

2022/05/10 01:26 編集

やらないつもりかな? ろんりひていえんざんしがろんりえんざんしのいっしゅということをわかっていないでしょう? ろんりえんざんしはろんりえんざんにつかうもので、ろんりえんざんとびっとえんざんはちがうんですよ。 ちょっとむずかしかったですね。 あと、びっとえんざんをつかわないなら、わざわざへんかんをなんどもかさねてまでろんりひていえんざんしをつかわなくても、じょうけんえんざんしや if や switch しきをつかったほうがしんぷるになります。 ほかにも、はいれつと Array.IndexOf をつかうほうほうや、Dictionary をつかうほうほうがあります。 これらであれば、にゅうりょくされたもじれつを int になおさずつかえます。
y_waiwai

2022/05/10 02:08

まあ、あなたはそうおもう、わたしはそうおもう、でいいじゃありませんか。
Zuishin

2022/05/10 03:11 編集

これをこじんのおもいのちがいとしかうけとれないとは、ちょっとむずかしすぎたようですね。 じぶんでこーどをかけばすぐわかることです。 たぶんあなた、ずっと C# のこと C げんごだとおもってるでしょう。そのようなかんちがいをするしょしんしゃも、いなくはありません。
y_waiwai

2022/05/10 03:27

あなたがそうおもうならそうなんでしょう。きっと。
Zuishin

2022/05/10 03:35 編集

おもっているのがわたしだけじゃないことは、すこしまなべばすぐわかります。 きそなので。
y_waiwai

2022/05/10 03:54

まあ、NOTをしらないひとにいわれてもなあ、というかんそうですが
Zuishin

2022/05/10 04:07

面倒なので、難しい漢字を使います。辞書を活用して読んでください。 この回答は、質問の回答として、私の知っている、そして公式資料にある論理否定演算子では成り立ちません。 あなたが何を NOT と呼んでいるのか、実際に解決するコードを見せてください。 見せずにグダグダ言っているところを他人からどう見られている、どれほどみっともないことなのかは、この低評価の山でなんとなくわかるのではないかと思います。
fana

2022/05/10 10:49

あえて/わざわざ > ビット演算で解こう っていう前提条件を持ち込んだうえで,「その条件でやる場合」に関する質問をしているのですから,それに対して「そういうのはいいから,論理演算を使え」と返すのだと問われていることに対しての回答とはならないんじゃないですかね. (前提条件の良し悪しは別として)
y_waiwai

2022/05/10 11:21

どうみてもそれが前提条件だとは思えませんね あくまで質問くんが、ビット演算でどうにかしようとしたけどうまくいかなかった、と私は読みます。 #あなたはそう思う、私はそう思う、でいいじゃありませんか まあ、そういうことなので、NOTを使おう、と回答しております。 #そこへ、NOTを知らない(それも全く関係ないやつから)レスポンスが帰ってきたので、ちょっと遊んでやったというところですねw
Zuishin

2022/05/10 13:58 編集

遊んだにしちゃ満身創痍だけど、まだごまかせると自分で思い込もうとしているところが哀れ。自分じゃ高評価なんですかね、こんなので。 遊んでないで、真面目に回答してみてください。できるのなら。
Zuishin

2022/05/10 15:03 編集

> 「そういうのはいいから,論理演算を使え」と返すのだと問われていることに対しての回答とはならないんじゃないですかね. そっちもそうですが、そもそも次のように bool と int の変換などと言っているので、論理演算とビット演算の区別がついていないとしか思えません。 > えーと、boolとintのへんかんがわからないってはなしかな? 論理演算なら変換の必要はない(入力も出力も文字列なので int すら使う必要がない)し、! を使わなくても else でことたります。 ビット演算の質問ととらえた回答だとしても、ビット演算を使わなくてもよい質問ととらえた回答だとしても、どっちにしても変な笑いの漏れるようなトンチンカンな回答ですね。 本人は説明されてもポカーンとしてるのが尚更滑稽です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問