Некоторые операторы применяют унарное числовое преобразование к одному операнду, который должен создавать значение числового типа, а если операнд имеет тип времени байта, короткий или char, он переводится в значение типа int с помощью расширяющееся примитивное преобразование (§5.1.2).
String TYPE = "type";
long TOTAL_MASK = 0xFFFFFFFF;
long BASE_INBOX_TYPE = ~20; // (~)promotion to int first (not necessary)
long BASE_TYPE_MASK = 0x1F;
long type = (TOTAL_MASK - BASE_TYPE_MASK) | BASE_INBOX_TYPE;
System.out.println(type);