Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

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	satis-
       fies 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)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::byteswap&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help