对整数返回值进行逐位算术运算

时间:2015-04-13 12:52:07

标签: c++ integer return-value bitwise-operators

这里我们有一个函数fire(),它接受两个参数:

  • 大写字母(字符),范围为'A'..'A'+ BS_GRID_ROWS-1,表示要攻击的网格中的行。

  • 一个整数(整数),范围为1 .. BS_GRID_COLS,表示要攻击的网格列。

返回代码为:

  • 0,如果只有开放水域。
  • 将设置位BS_SHIP_HIT,或者将设置BS_SHIP_HIT和BS_SHIP_SANK。此外,被击中的船将在返回码的最低四位表示。您可以使用BS_SHIP_MASK来帮助提取船型的编号。

半伪代码解释:

//r is A ... (A + BS_GRID_ROWS - 1)
//c is 1 ... BS_GRID_COLS

fire(char r, int c) {
    //some set of commands

    if(miss) {
        return 0;
    else if(sink) {
        return hit + sunk + size;
    else if(hit) {
        return hit;
    else {
        return miss;
    }
}

我不确定如何从返回值中提取这些单独的值(命中,沉没,大小)。

此处可以看到实际的.h文件及其相关const值:

#ifndef BATTLESHIP
#define BATTLESHIP
const int BS_SHIP_HIT  = 0x10;  // Ship is hit, or
const int BS_SHIP_SANK = 0x20; // sank (must also | BS_SHIP_HIT)
const int BS_CARRIER   = 1;
const int BS_BATTLESHIP= 2;
const int BS_CRUISER   = 3;
const int BS_DESTROYER = 4;
const int BS_SUBMARINE = 5;
const int BS_SHIP_COUNT = 5;
const int BS_SHIP_MASK = 0x0F;
const int BS_CARRIER_SIZE   = 5;
const int BS_BATTLESHIP_SIZE= 4;
const int BS_CRUISER_SIZE   = 3;
const int BS_DESTROYER_SIZE = 2;
const int BS_SUBMARINE_SIZE = 3;
const int BS_MODE_NEW_GAME   = 1;
const int BS_MODE_CONTINUE_GAME = 2;
const int BS_GRID_ROWS = 10; // letters A to J
const int BS_GRID_COLS = 10; // numbers 1 to 10
const int MaxPlayerCount = 65; // Maximum size for following arrays
extern int userIncoming(char, int);
extern int userBattle(int, int);
extern int incomingStub(char, int);
extern int battleStub(int, int);
extern int (*fire[])(char, int);
extern int (*battleship[])(int, int);
extern char const *playerName[];
#endif

1 个答案:

答案 0 :(得分:3)

或许这样的事情?

int result = fire(r, c);
if (result & BS_SHIP_HIT)
{
    std::cout << "Ship of size " << result & BS_SHIP_MASK << " hit\n";
}

如果在BS_SHIP_HIT中设置了result位,则result & BIT_SHIP_HIT的结果将等于BS_SHIP_HIT,否则结果将为零(这相当于false )。

result & BS_SHIP_MASK的结果将是result中的低四位。


或者让我们使用实际位来查看它:

BS_SHIP_HIT等于二进制值00010000BS_SHIT_MASK等于00001111。假设fire返回00010101BS_SHIP_HIT集和大小5),那么if条件将

  00010000
& 00010101
----------
= 00010000

然后,对于打印,表达式将是

  00010101
& 00001111
----------
= 00000101