| File: InternalUtilities\BitArithmeticUtilities.cs | Web Access |
| Project: src\roslyn\src\Compilers\Core\Portable\Microsoft.CodeAnalysis.csproj (Microsoft.CodeAnalysis) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System.Diagnostics; namespace Roslyn.Utilities { internal static class BitArithmeticUtilities { public static int CountBits(int v) { return CountBits(unchecked((uint)v)); } public static int CountBits(uint v) { unchecked { v -= ((v >> 1) & 0x55555555u); v = (v & 0x33333333u) + ((v >> 2) & 0x33333333u); return (int)((v + (v >> 4) & 0xF0F0F0Fu) * 0x1010101u) >> 24; } } public static int CountBits(long v) { return CountBits(unchecked((ulong)v)); } public static int CountBits(ulong v) { unchecked { const ulong MASK_01010101010101010101010101010101 = 0x5555555555555555UL; const ulong MASK_00110011001100110011001100110011 = 0x3333333333333333UL; const ulong MASK_00001111000011110000111100001111 = 0x0F0F0F0F0F0F0F0FUL; const ulong MASK_00000000111111110000000011111111 = 0x00FF00FF00FF00FFUL; const ulong MASK_00000000000000001111111111111111 = 0x0000FFFF0000FFFFUL; const ulong MASK_11111111111111111111111111111111 = 0x00000000FFFFFFFFUL; v = (v & MASK_01010101010101010101010101010101) + ((v >> 1) & MASK_01010101010101010101010101010101); v = (v & MASK_00110011001100110011001100110011) + ((v >> 2) & MASK_00110011001100110011001100110011); v = (v & MASK_00001111000011110000111100001111) + ((v >> 4) & MASK_00001111000011110000111100001111); v = (v & MASK_00000000111111110000000011111111) + ((v >> 8) & MASK_00000000111111110000000011111111); v = (v & MASK_00000000000000001111111111111111) + ((v >> 16) & MASK_00000000000000001111111111111111); v = (v & MASK_11111111111111111111111111111111) + ((v >> 32) & MASK_11111111111111111111111111111111); return (int)v; } } internal static uint Align(uint position, uint alignment) { Debug.Assert(CountBits(alignment) == 1); uint result = position & ~(alignment - 1); if (result == position) { return result; } return result + alignment; } internal static int Align(int position, int alignment) { Debug.Assert(position >= 0 && alignment > 0); Debug.Assert(CountBits(alignment) == 1); int result = position & ~(alignment - 1); if (result == position) { return result; } return result + alignment; } } }