diff --git a/src/Pieces/PiecesFiles.cpp b/src/Pieces/PiecesFiles.cpp index b6c70cd..15e7036 100644 --- a/src/Pieces/PiecesFiles.cpp +++ b/src/Pieces/PiecesFiles.cpp @@ -55,7 +55,12 @@ bool PiecesFiles::savePieces(int polyominoSize, std::vector& polyomin // write the positions of the piece for (int i = 0; i < bytesNeeded; i++) { - buffer << static_cast(polyomino.getPositionsData()[i/4] >> ((i%4) * 8)); + buffer << static_cast( + ( + polyomino.getPositionsData()[i / sizeof(std::uint64_t)] >> + (56 - ((i % sizeof(std::uint64_t)) * 8)) + ) + & 0xFF); } } @@ -118,7 +123,8 @@ bool PiecesFiles::loadPieces(int polyominoSize, std::vector& pieces, std: for (int j = 0; j < bytesNeeded; j++) { buffer >> positionByte; - polyominoData[j/4] |= static_cast(positionByte) << ((j%4) * 8); + polyominoData[j / sizeof(std::uint64_t)] |= + (static_cast(positionByte) << (56 - ((j % sizeof(std::uint64_t)) * 8))); } pieces.emplace_back(Polyomino(std::move(polyominoData), length), pieceBlock); diff --git a/src/Pieces/Polyomino.cpp b/src/Pieces/Polyomino.cpp index 45d9e5d..f0e634a 100644 --- a/src/Pieces/Polyomino.cpp +++ b/src/Pieces/Polyomino.cpp @@ -277,7 +277,7 @@ std::vector Polyomino::getPositions() const { int posIndex = y * this->length + x; int longIndex = posIndex / (sizeof(std::uint64_t) * 8); int bitIndex = posIndex % (sizeof(std::uint64_t) * 8); - if (this->positions[longIndex] & static_cast(1) << (sizeof(std::uint64_t) * 8 - bitIndex)) { + if (this->positions[longIndex] & static_cast(1) << (sizeof(std::uint64_t) * 8 - bitIndex - 1)) { result.push_back(Position(x, y)); } } @@ -328,19 +328,19 @@ bool Polyomino::contains(const Position& position) const { int posIndex = position.y * this->length + position.x; int longIndex = posIndex / (sizeof(std::uint64_t) * 8); int bitIndex = posIndex % (sizeof(std::uint64_t) * 8); - return this->positions[longIndex] & static_cast(1) << (sizeof(std::uint64_t) * 8 - bitIndex); + return this->positions[longIndex] & static_cast(1) << (sizeof(std::uint64_t) * 8 - bitIndex - 1); } void Polyomino::insert(const Position& position) { int posIndex = position.y * this->length + position.x; int longIndex = posIndex / (sizeof(std::uint64_t) * 8); int bitIndex = posIndex % (sizeof(std::uint64_t) * 8); - this->positions[longIndex] |= static_cast(1) << (sizeof(std::uint64_t) * 8 - bitIndex); + this->positions[longIndex] |= static_cast(1) << (sizeof(std::uint64_t) * 8 - bitIndex - 1); } void Polyomino::erase(const Position& position) { int posIndex = position.y * this->length + position.x; int longIndex = posIndex / (sizeof(std::uint64_t) * 8); int bitIndex = posIndex % (sizeof(std::uint64_t) * 8); - this->positions[longIndex] &= ~(static_cast(1) << (sizeof(std::uint64_t) * 8 - bitIndex)); + this->positions[longIndex] &= ~(static_cast(1) << (sizeof(std::uint64_t) * 8 - bitIndex - 1)); } \ No newline at end of file