読者です 読者をやめる 読者になる 読者になる

コードを短く書く人のブログ

コードゴルフを稀に取り上げるブログ

アドレスから添字を求めるのがめんどくさい

どうも、@orisanoです。

今日は、bsearchという関数を使ってて思ったのですが、
ポインタから添字を求めるのってちょっとだけめんどくさいなって思いました。
ので、ソースコードを書いて、忘備録的にあげようかなと思った次第です。
以下コード

typedef unsigned long long ulong;
ulong ptr2index(void *head, void *cur, size_t size)
{
	ulong ha = (ulong)head;
	ulong ca = (ulong)cur;

	if (ca < ha) ha ^= ca ^= ha ^= ca;
	return ((ca - ha) / size);
}

追記: どの処理系でもできるか保証できないですが

int ary[1024];
int *p = ary;
int *q = ary + 54;
int d;

d = q - p;

という感じでやっても添字は求まるっぽいです。(詳しくは調べてないです

処理系によってアドレスが64bitだったりするので、最初からlong longにしておけば32bitの処理系でも大丈夫なんじゃないかっていう甘えです。