C++ 整数返回值的位运算

C++ 整数返回值的位运算,c++,integer,return-value,bitwise-operators,C++,Integer,Return Value,Bitwise Operators,这里我们有一个函数fire(),它接受两个参数: “A”范围内的大写字母(char)“+BS_GRID_ROWS-1,指示网格中要攻击的行 范围为1.的整数(int)。。BS_GRID_COLS,指示要攻击的网格列 返回代码为: 如果只有开放水域,则为0 将设置位BS_SHIP_HIT,或同时设置BS_SHIP_HIT和BS_SHIP_sink。此外,被击中的船舶将在返回码的最低四位显示。您可以使用BS_SHIP_MASK来帮助提取船舶类型的编号 半伪码解释: //r is A ...

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

  • “A”范围内的大写字母(char)“+BS_GRID_ROWS-1,指示网格中要攻击的行

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

返回代码为:

  • 如果只有开放水域,则为0
  • 将设置位BS_SHIP_HIT,或同时设置BS_SHIP_HIT和BS_SHIP_sink。此外,被击中的船舶将在返回码的最低四位显示。您可以使用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

也许是这样的

int result = fire(r, c);
if (result & BS_SHIP_HIT)
{
    std::cout << "Ship of size " << result & BS_SHIP_MASK << " hit\n";
}
然后对于打印,表达式将是

00010000 & 00010101 ---------- = 00010000 00010101 & 00001111 ---------- = 00000101 00010101 & 00001111 ---------- = 00000101
试试按位AND运算符
&
@JoachimPileborg我不太确定它是如何工作的。你能给我解释一下吗?我建议返回一个包含bools的结构(如果你关心速度的话,也可以将bools的地址或引用作为参数传递)。比一点点的摆弄更清楚(为什么有人会这么做?你最终还是要为它编写宏!),而且不局限于一定数量的状态。除非
fire()
的规范是给定的;-)。像这样的位摆弄现在通常在特殊情况下进行,例如极低的内存。如果你只是想制作一个战舰游戏,我会使用枚举、类等其他高级技术。所有大写字母都是按惯例为宏保留的。与其用BS预装所有东西,不如把C++放在命名空间中。