home | help
std::byteswap(3)	       C++ Standard Libary		std::byteswap(3)

NAME
     std::byteswap - std::byteswap

Synopsis
	Defined in header <bit>
	template< class T >		       (since C++23)
	constexpr T byteswap( T n ) noexcept;

	Reverses the bytes in the given integer value n.

	std::byteswap  participates  in  overload resolution only if T satisfies
     integral,
	i.e., T is an integer type. The program is ill-formed if T  has  padding
     bits.

Parameters
	n - integer value

Return value
	An  integer  value  of	type T whose object representation comprises the
     bytes of that
	of n in reversed order.

Notes
	This function is useful for processing data of different endianness.

	Feature-test macro  Value    Std      Feature
	__cpp_lib_byteswap 202110L (C++23) std::byteswap

Possible implementation
	template<std::integral T>
	constexpr T byteswap(T value) noexcept
	{
	    static_assert(std::has_unique_object_representations_v<T>,
			  "T may not have padding bits");
	    auto  value_representation	 =   std::bit_cast<std::array<std::byte,
     sizeof(T)>>(value);
	    std::ranges::reverse(value_representation);
	    return std::bit_cast<T>(value_representation);
	}

Example
     // Run this code

      #include <bit>
      #include <concepts>
      #include <cstdint>
      #include <iomanip>
      #include <iostream>

      template<std::integral T>
      void dump(T v, char term = '\n')
      {
	  std::cout << std::hex << std::uppercase << std::setfill('0')
		    << std::setw(sizeof(T) * 2) << v << " : ";
	  for (std::size_t i{}; i != sizeof(T); ++i, v >>= 8)
	      std::cout << std::setw(2) << static_cast<unsigned>(T(0xFF) & v) <<
     ' ';
	  std::cout << std::dec << term;
      }

      int main()
      {
	  static_assert(std::byteswap('a') == 'a');

	  std::cout << "byteswap for U16:\n";
	  constexpr auto x = std::uint16_t(0xCAFE);
	  dump(x);
	  dump(std::byteswap(x));

	  std::cout << "\nbyteswap for U32:\n";
	  constexpr auto y = std::uint32_t(0xDEADBEEFu);
	  dump(y);
	  dump(std::byteswap(y));

	  std::cout << "\nbyteswap for U64:\n";
	  constexpr auto z = std::uint64_t{0x0123456789ABCDEFull};
	  dump(z);
	  dump(std::byteswap(z));
      }

Possible output:
      byteswap for U16:
      CAFE : FE CA
      FECA : CA FE

      byteswap for U32:
      DEADBEEF : EF BE AD DE
      EFBEADDE : DE AD BE EF

      byteswap for U64:
      0123456789ABCDEF : EF CD AB 89 67 45 23 01
      EFCDAB8967452301 : 01 23 45 67 89 AB CD EF

See also
	endian	indicates the endianness of scalar types
	(C++20) (enum)
	rotl	computes the result of bitwise left-rotation
	(C++20) (function template)
	rotr	computes the result of bitwise right-rotation
	(C++20) (function template)

http://cppreference.com 	   2024.06.10			std::byteswap(3)

home | help