【解決方法】ビットマスクを使用して変数を取得/設定するにはどうすればよいですか?


したがって、単純なスタックベースの仮想マシンを作成しようとしています。スタックを int8_t 型の配列にして、すべての要素が 1 バイトになるようにします。 しかし、私はバイトだけで作業したくありません。16、32、および 64 ビットの数値も使用したいので、ビットマスクが必要です。

これは現在のコードです:

C++
#include <stdint.h>
#include <stdio.h>
#define STACKSIZE 65536

int8_t stack[STACKSIZE];
void push(int8_t);
int8_t pop();
void pushw(int16_t);
int16_t popw();
int64_t top = -1;

int main() {
	pushw(938);
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", stack[i]);
	}
	printf("\n\n%d", popw());
	return 0;
}

void push(int8_t x) {
	if (rsp == STACKSIZE - 1)
	{
		printf("Overflow!");
	}
	else
	{
		rsp++;
		stack[rsp] = x;
	}
}

int8_t pop() {
	if (rsp == -1) {
		printf("Underflow");
		return -1;
	}
	else {
		rsp--;
		return stack[rsp + 1];
	}
}

//LSB-MSB at push
//MSH-LSB at pop
void pushw(int16_t x) {
	push(x & 0x00FF);
	push(x & 0xFF00);
}

int16_t popw() {
	int16_t r = pop();
	r |= (pop() << 8);
	return r;
}

期待される出力:

234 //I am not too good at decimal-binary conversion, but i think these are right
2
0
0
0
0
0
0
0
0


938

私が代わりに得るもの:

-86
0
0
0
0
0
0
0
0
0

-22016

助けてください。

私が試したこと:

順序を変更しようとしましたが、最初の 2 つの数字として 0, -86 が返され、最後に popw(); で -86 が返されました。

解決策 1

プッシュする前に上位バイトをシフトする必要があります。

void pushw(int16_t x) {
プッシュ (x & 0x00FF);
プッシュ ((x & 0xFF00) >> 8);
}

コメント

タイトルとURLをコピーしました