[Java] 2つのint型整数を無理やりLong型で保持する→できない

わざわざPoint型を用意するのが面倒で、Longで纏めてしまおうと思いました。

HashMapのキーにする用途だけなので新規クラスも必要ないじゃろ。


余計厄介になりました。

public class C1{
public static void main(String[] args){
Long key1=generateKey(10,10);
Long key2=generateKey(20,10);
Long key3=generateKey(10,10);
Long key4=generateKey(0,0);
Long key5=generateKey(0,0);
Long key6=generateKey(-10,10);
Long key7=generateKey(10,-10);
Long key8=generateKey(-10,-10);
System.out.println("key1=key2?"+key1.equals(key2));
System.out.println("key1=key3?"+key1.equals(key3));
System.out.println("key1=key4?"+key1.equals(key4));
System.out.println("key4=key5?"+key4.equals(key5));
System.out.println("key6=key7?"+key6.equals(key7));
System.out.println("key6=key8?"+key6.equals(key8));
System.out.println("key7=key8?"+key7.equals(key8));
System.out.println("key1=key7?"+key1.equals(key7));
}
private static Long generateKey(int x,int y){
return new Long((long)x|((long)y<<32));
}
}

実行結果です。
key1=key2?false
key1=key3?true
key1=key4?false
key4=key5?true
key6=key7?false
key6=key8?true
key7=key8?false
key1=key7?false

分かりにくいですが、key6 と key8の比較がおかしい。yの符号が消える?
bitを見るメソッドあったっけ?作った方が早いな?

private static Long generateKey(int x,int y){
Long r;
bit(x,32);bit(y,32);
System.out.println("");
r= new Long(((long)x)|(((long)y)<<32));
bit(r.longValue(),64);
System.out.println("");
System.out.println("_______________________________|");
return r;
}
private static void bit(long val,int size){
while(0<=--size){
System.out.print(val&1);
val=val>>1;
}
}

(-10,10)の実行結果
_______________________________|
0110111111111111111111111111111101010000000000000000000000000000
0110111111111111111111111111111111111111111111111111111111111111


\(ツ)/

別の計算方法をすれば行けそうな気がしないでもないですが…まぁいいや。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : Java

コメントの投稿

非公開コメント

ふごぉぉぉ

符号付整数だからダメなんだと思います。
マイナスの整数をビットシフトすると、符号が考慮されるので符号なしのビットシフトと結果が異なります。
符号なし整数にするか、符号なしのままでやりたいなら、ビットシフトを使わなければいいのです。
例えば C なら以下のようにすれば思った通りの結果が得られます。
分離も同じことを逆にやればいいわけです。
ただ、Java でできるかどうかはわかりません、ごめんなさい。
こんなことだと、Java ちゃんに嫌われる・・・。
----------------ソース----------------
char *boolstr[] = {"false", "true"};

long long generateKey(int x, int y)
{
int temp[2];
temp[0] = x;
temp[1] = y;
return *(long long *)temp;
}

char *equals(long long l1, long long l2)
{
return &boolstr[l1==l2][0];
}

int main()
{
long long key1=generateKey(10,10);
long long key2=generateKey(20,10);
long long key3=generateKey(10,10);
long long key4=generateKey(0,0);
long long key5=generateKey(0,0);
long long key6=generateKey(-10,10);
long long key7=generateKey(10,-10);
long long key8=generateKey(-10,-10);
printf("key1=key2?%s\n", equals(key1, key2));
printf("key1=key3?%s\n", equals(key1, key3));
printf("key1=key4?%s\n", equals(key1, key4));
printf("key4=key5?%s\n", equals(key4, key5));
printf("key6=key7?%s\n", equals(key6, key7));
printf("key6=key8?%s\n", equals(key6, key8));
printf("key7=key8?%s\n", equals(key7, key8));
printf("key1=key7?%s\n", equals(key1, key7));
return 0;
}
---------------結果-----------------
key1=key2?false
key1=key3?true
key1=key4?false
key4=key5?true
key6=key7?false
key6=key8?false
key7=key8?false
key1=key7?false

Re: ふごぉぉぉ

コメントありがとう+codeIQ1番乗りおめでとうございますヾ(:3ノシヾ)ノシ

>int temp[2];

union共用体思い出しますね…
-----------------------------
#include <stdio.h>

typedef union DEFPoint{
int value[2];
long long key;
}Point;

int main(){
Point p,q;
p.value[0]=-10;
p.value[1]=-20;
q.value[0]=-10;
q.value[1]=-20;
printf ("%d\n",p.key == q.key);
return 0;
}
-----------------------------
あれ、だんだん元の目的が薄くなってきた。

javaの場合、そもそもポインタの概念が無いので、
無理やり同じメモリ領域を別の型で共有せよ、という操作はかなり厳しいかな…と考えています。

-----------------------------
>符号が考慮される
なるほど、マスクすればいいんですね…。ありがとうございます

r= new Long(((long)x&0x00000000FFFFFFFFl)|(((long)y)<<32));

Re: ふごぉぉぉ

レスありがとうございます。

「初の一番乗りゲット!」は、一番乗りを狙い、深く考えずに総チェックで組んで速攻で提出しました。
いつもの問題なら、総チェックだとタイムアウトとなる場合がほとんどなのですが、あの問題は大丈夫でした。
もし、年月日を含めた問題なら間違いなくタイムアウトだったでしょうけど・・・。
正解した時点で「挑戦済み1人」だったので、ようやく一番乗りが取れたと確信しました。
その後で、ゆっくりと、もっとうまいアルゴリズムでプログラムを組んで再提出しました。
そのアルゴリズムなら、年月日を含めた問題でもタイムアウトにならないのではないかと・・・。

それにしても、最近、難しい問題が多くないですか?
入力値の上限が書いてなくて、自動採点を通すと、その結果には何ビットの整数が必要なの?という某問題とか。
そんなのが、1度に3つも出題されるとか、勘弁して欲しい・・・。
長時間、かかりっきりになるわけにはいかないので、ぱっと見で簡単に解けないと思ったら諦めて後からにしますが。

> r= new Long(((long)x&0x00000000FFFFFFFFl)|(((long)y)<<32));

なるほど、ポインタが使えなくても、その方法がありましたね!
プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++JavaRubyUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
1815位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
333位
アクセスランキングを見る>>