1 /* bitrotate.h - Rotate bits in integers 2 Copyright (C) 2008-2021 Free Software Foundation, Inc. 3 4 This file is free software: you can redistribute it and/or modify 5 it under the terms of the GNU Lesser General Public License as 6 published by the Free Software Foundation; either version 2.1 of the 7 License, or (at your option) any later version. 8 9 This file is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public License 15 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 16 17 /* Written by Simon Josefsson <simon@josefsson.org>, 2008. */ 18 19 #ifndef _GL_BITROTATE_H 20 #define _GL_BITROTATE_H 21 22 #include <limits.h> 23 #include <stdint.h> 24 #include <sys/types.h> 25 26 #ifndef _GL_INLINE_HEADER_BEGIN 27 #error "Please include config.h first." 28 #endif 29 _GL_INLINE_HEADER_BEGIN 30 #ifndef BITROTATE_INLINE 31 # define BITROTATE_INLINE _GL_INLINE 32 #endif 33 34 #ifdef UINT64_MAX 35 /* Given an unsigned 64-bit argument X, return the value corresponding 36 to rotating the bits N steps to the left. N must be between 1 and 37 63 inclusive. */ 38 BITROTATE_INLINE uint64_t 39 rotl64 (uint64_t x, int n) /* */ 40 { 41 return ((x << n) | (x >> (64 - n))) & UINT64_MAX; 42 } 43 44 /* Given an unsigned 64-bit argument X, return the value corresponding 45 to rotating the bits N steps to the right. N must be between 1 to 46 63 inclusive.*/ 47 BITROTATE_INLINE uint64_t 48 rotr64 (uint64_t x, int n) /* */ 49 { 50 return ((x >> n) | (x << (64 - n))) & UINT64_MAX; 51 } 52 #endif 53 54 /* Given an unsigned 32-bit argument X, return the value corresponding 55 to rotating the bits N steps to the left. N must be between 1 and 56 31 inclusive. */ 57 BITROTATE_INLINE uint32_t 58 rotl32 (uint32_t x, int n) /* */ 59 { 60 return ((x << n) | (x >> (32 - n))) & UINT32_MAX; 61 } 62 63 /* Given an unsigned 32-bit argument X, return the value corresponding 64 to rotating the bits N steps to the right. N must be between 1 to 65 31 inclusive.*/ 66 BITROTATE_INLINE uint32_t 67 rotr32 (uint32_t x, int n) /* */ 68 { 69 return ((x >> n) | (x << (32 - n))) & UINT32_MAX; 70 } 71 72 /* Given a size_t argument X, return the value corresponding 73 to rotating the bits N steps to the left. N must be between 1 and 74 (CHAR_BIT * sizeof (size_t) - 1) inclusive. */ 75 BITROTATE_INLINE size_t 76 rotl_sz (size_t x, int n) /* */ 77 { 78 return ((x << n) | (x >> ((CHAR_BIT * sizeof x) - n))) & SIZE_MAX; 79 } 80 81 /* Given a size_t argument X, return the value corresponding 82 to rotating the bits N steps to the right. N must be between 1 to 83 (CHAR_BIT * sizeof (size_t) - 1) inclusive. */ 84 BITROTATE_INLINE size_t 85 rotr_sz (size_t x, int n) /* */ 86 { 87 return ((x >> n) | (x << ((CHAR_BIT * sizeof x) - n))) & SIZE_MAX; 88 } 89 90 /* Given an unsigned 16-bit argument X, return the value corresponding 91 to rotating the bits N steps to the left. N must be between 1 to 92 15 inclusive, but on most relevant targets N can also be 0 and 16 93 because 'int' is at least 32 bits and the arguments must widen 94 before shifting. */ 95 BITROTATE_INLINE uint16_t 96 rotl16 (uint16_t x, int n) /* */ 97 { 98 return (((unsigned int) x << n) | ((unsigned int) x >> (16 - n))) 99 & UINT16_MAX; 100 } 101 102 /* Given an unsigned 16-bit argument X, return the value corresponding 103 to rotating the bits N steps to the right. N must be in 1 to 15 104 inclusive, but on most relevant targets N can also be 0 and 16 105 because 'int' is at least 32 bits and the arguments must widen 106 before shifting. */ 107 BITROTATE_INLINE uint16_t 108 rotr16 (uint16_t x, int n) /* */ 109 { 110 return (((unsigned int) x >> n) | ((unsigned int) x << (16 - n))) 111 & UINT16_MAX; 112 } 113 114 /* Given an unsigned 8-bit argument X, return the value corresponding 115 to rotating the bits N steps to the left. N must be between 1 to 7 116 inclusive, but on most relevant targets N can also be 0 and 8 117 because 'int' is at least 32 bits and the arguments must widen 118 before shifting. */ 119 BITROTATE_INLINE uint8_t 120 rotl8 (uint8_t x, int n) /* */ 121 { 122 return (((unsigned int) x << n) | ((unsigned int) x >> (8 - n))) & UINT8_MAX; 123 } 124 125 /* Given an unsigned 8-bit argument X, return the value corresponding 126 to rotating the bits N steps to the right. N must be in 1 to 7 127 inclusive, but on most relevant targets N can also be 0 and 8 128 because 'int' is at least 32 bits and the arguments must widen 129 before shifting. */ 130 BITROTATE_INLINE uint8_t 131 rotr8 (uint8_t x, int n) /* */ 132 { 133 return (((unsigned int) x >> n) | ((unsigned int) x << (8 - n))) & UINT8_MAX; 134 } 135 136 _GL_INLINE_HEADER_END 137 138 #endif /* _GL_BITROTATE_H */