Фундамент не крепкий, и земля трясется. Эта статья былаhttps://www.yourbatman.cnВключено, включая стек технологий Spring, MyBatis, JVM, промежуточное ПО и другие небольшие и красивыестолбецна бесплатное обучение. Обратите внимание на общедоступный номер【Утопия Бат] Прорваться один за другим, глубокое мастерство,
✍Предисловие
Здравствуйте, меня зовут Ваш Бэтмен.
Этот выпуск является сериализацией серии углубленного анализа Джексона, хотя в нем говорилось только о егоПотоковое APIуровне, но подвергся многим из егоFeature
характерная черта.更为重要的是我在文章里赞其设计精妙,处理优雅,因此就有小伙伴私信给我问这样的话:Экстерьер: Джексон Эта тема очень маленькая, смотрю читаю, не уверен. Но то, что я сказал,задолженность, Не спать всю ночь и обязательно выкладывать обещанный платный контент в открытый доступ, ведь есть еще несколько человек, которые занимаются проституцией ни за что 😄.
Голос за кадром: Впредь не высовывайся и меньше хвастайся┭┮﹏┭┮
Хотя это небольшая группа, все еще есть друзья, которые хотят узнать больше о волне, что действительно взволновало меня на три секунды. В таком случае, давайте сделаем это, эта статья впервые узнаетБитовые операции в Java. Битовые операции редко используются в Java, так почему же они так популярны в Джексоне? Все в двух словах:представление/эффективный. Когда вы работаете с ним на языке, который может понять компьютер, вам не нужно слишком много думать об этом.
✍Текст
Когда дело доходит до битовых операций, для подавляющего большинства программистов Java этои знакомые и незнакомыеощущение. Знакомство потому, что вы должны были изучить JavaSE, когда учитесь, и вы можете увидеть это, когда посмотрите на некоторые фреймворки с открытым исходным кодом (особенно исходный код JDK); странно, потому что мы не будем использовать его с высокой вероятностью. Конечно, есть причины не быть "популярным": непростая для понимания, несоответствующая человеческому мышлению, плохая читабельность...
Совет: Вообще говоря, для программы важнее, чтобы ее понимали люди, чем машина.
побитовая операция это вlow-level
Он больше используется в языке Java, но редко упоминается в языке высокого уровня, таком как Java. Хотя мы используем его очень мало, Java также его поддерживает, ведь часто используются битовые операции.Лучшие практики.
Битовые операции редко используются в повседневной разработке, но разумное использование битовых операций может значительно сократить накладные расходы и оптимизировать алгоритмы.Одно утверждение может оказать мало влияния на код, но в случае высокого повторения и большого объема данных оно сэкономит много накладных расходов.
бинарный
Прежде чем понять, что такое битовая операция, необходимо сначала популяризировать понятие двоичного кода.
Двоичная система счисления широко используется в вычислительной технике. Двоичные данные — это число, представленное двумя цифрами, 0 и 1. Его основание равно 2, а правило округлениякаждые два в один, правило заимствованияодолжить один на двоих. Поскольку он использует только два цифровых символа, 0 и 1, он очень прост и удобен, и его легко реализовать в электронном виде.
Советы: Полупроводник ВКЛ представляет 1, ВЫКЛ представляет 0, что является принципом нижнего уровня вычислений ЦП😄
Давайте посмотрим на пример:
求 1011(二进制)+ 11(二进制) 的和?
结果为:1110(二进制)
Двоичный формат очень, очень прост для понимания, намного проще, чем десятичный. Вы также можете подумать о том, как преобразовать двоичное число в десятичное? Ведь 1110 этого не видит. Есть или пойти глубже и продолжить думать: как преобразовать в восьмеричное, шестнадцатеричное, 30-двоичное... Шестнадцатеричное преобразование - это не то, о чем эта статья хочет поговорить, пожалуйста, не стесняйтесь позаботиться о себе, если вам это интересно.
двоичный код и кодировка
Хоть это и не очень связано с содержанием данной статьи, но это загвоздка, ведь проблемы с кодированием все еще относительно распространены в разработке.
Только 1 и 0 могут быть распознаны компьютером, который является двоичным, а 1 и 0 могут выражать мир.всеТекстовые и языковые символы. Как выразить слова и символы? Это включает в себяКодировка символов. Кодировка символов заставляет каждый символ соответствовать десятичному числу (обратите внимание на разницу между символами и числами, например,0
Десятичное число, соответствующее символу, равно48
), а затем преобразовать десятичные числа в двоичные, понятные компьютеру, и компьютер отобразит соответствующие слова или символы после считывания этих единиц и нулей.
- в целом правильноанглийские символыДля китайских символов один байт представляет один символ, но для китайских символов, поскольку использовалась кодировка младшего разряда (ранние компьютеры не поддерживали китайский язык, поэтому единственный способ расширить поддержку — использовать больше байтов) Высокий битовое расширение
- диапазон кодировок набора символов
utf-8>gbk>iso-8859-1(latin1)>ascll
. Кодировка ascll — это английская аббревиатура американского стандартного кода обмена информацией, которая включает в себя часто используемые символы, такие как арабские цифры, английские буквы и некоторые печатные символы, всего 255 (вообще говоря, всего 128 символов — это не так уж и много). проблема)
UTF-8
: набор 8-битных единиц кодирования.переменная длинаКодировка кодирует кодовую точку (Юникод) в 1-4 байта (1 байт для английского языка, 3 байта для большинства китайских символов).
Двоичный файл в Java
До версии Java7 Java не поддерживала прямую запись других базовых литералов, кроме десятичных. Но это разрешено в Java 7 и более поздних версиях:
- Двоичный: ведущий 0b/0B
- Восьмеричный: ведущий 0
- Десятичный: по умолчанию, не нужно добавлять перед
- Шестнадцатеричный: добавить 0x/0X в начало
@Test
public void test1() {
//二进制
int i = 0B101;
System.out.println(i); //5
System.out.println(Integer.toBinaryString(i));
//八进制
i = 0101;
System.out.println(i); //65
System.out.println(Integer.toBinaryString(i));
//十进制
i = 101;
System.out.println(i); //101
System.out.println(Integer.toBinaryString(i));
//十六进制
i = 0x101;
System.out.println(i); //257
System.out.println(Integer.toBinaryString(i));
}
Результирующая программа, вывод:
5
101
65
1000001
101
1100101
257
100000001
проиллюстрировать:System.out.println()
Он будет автоматически преобразован в десятичный формат, а затем выведен;toBinaryString()
Указывает, что выполняется преобразование в двоичный файлнитьдля вывода.
Удобный базовый API конвертации
JDK с1.0
Он с самого начала предоставляет очень удобный базовый API преобразования, который очень полезен, когда он нам нужен.
@Test
public void test2() {
int i = 192;
System.out.println("---------------------------------");
System.out.println("十进制转二进制:" + Integer.toBinaryString(i)); //11000000
System.out.println("十进制转八进制:" + Integer.toOctalString(i)); //300
System.out.println("十进制转十六进制:" + Integer.toHexString(i)); //c0
System.out.println("---------------------------------");
// 统一利用的为Integer的valueOf()方法,parseInt方法也是ok的
System.out.println("二进制转十进制:" + Integer.valueOf("11000000", 2).toString()); //192
System.out.println("八进制转十进制:" + Integer.valueOf("300", 8).toString()); //192
System.out.println("十六进制转十进制:" + Integer.valueOf("c0", 16).toString()); //192
System.out.println("---------------------------------");
}
Запускаем программу, выводим:
---------------------------------
十进制转二进制:11000000
十进制转八进制:300
十进制转十六进制:c0
---------------------------------
二进制转十进制:192
八进制转十进制:192
十六进制转十进制:192
---------------------------------
Как доказать, что Long 64-битный?
Я полагаю, каждый Javaer знает, что тип Long в Java занимает 8 байт (64 бита), так как же это доказать?
Советы: Это классический вопрос на собеседовании, по крайней мере, я задавал его много раз~
Есть самый простой способ: получить тип Longмаксимальное значение, используйте двоичное представление для преобразования в строку, чтобы увидеть длину, код выглядит следующим образом:
@Test
public void test3() {
long l = 100L;
//如果不是最大值 前面都是0 输出的时候就不会有那么长了(所以下面使用最大/最小值示例)
System.out.println(Long.toBinaryString(l)); //1100100
System.out.println(Long.toBinaryString(l).length()); //7
System.out.println("---------------------------------------");
l = Long.MAX_VALUE; // 2的63次方 - 1
//正数长度为63为(首位为符号位,0代表正数,省略了所以长度是63)
//111111111111111111111111111111111111111111111111111111111111111
System.out.println(Long.toBinaryString(l));
System.out.println(Long.toBinaryString(l).length()); //63
System.out.println("---------------------------------------");
l = Long.MIN_VALUE; // -2的63次方
//负数长度为64位(首位为符号位,1代表负数)
//1000000000000000000000000000000000000000000000000000000000000000
System.out.println(Long.toBinaryString(l));
System.out.println(Long.toBinaryString(l).length()); //64
}
Запускаем программу, выводим:
1100100
7
---------------------------------------
111111111111111111111111111111111111111111111111111111111111111
63
---------------------------------------
1000000000000000000000000000000000000000000000000000000000000000
64
Описание: В компьютере отрицательное число положительноедополнятьформа выражения. Таким же образом можно доказать себе, что тип Integer 32 бита (4 байта).
Битовые операции в Java
Есть еще много побитовых операторов, поддерживаемых языком Java, которые перечислены ниже:
-
&
: побитовое И -
|
: побитовое ИЛИ -
~
: побитовое НЕ -
^
: побитовое исключающее ИЛИ -
<<
: оператор сдвига влево -
>>
: оператор сдвига вправо -
>>>
: беззнаковый оператор сдвига вправо
Удалить~
За исключениемБинарныйОператор, обрабатываемые данные могут быть только целыми (длинными или короткими) или символьными. Для этих типов операций ниже приведены примеры, чтобы было понятно с первого взгляда.
Поскольку это операция, ее все же можно разделить на две категории: простая операция и составная операция для классификации и объяснения.
Советы: Для простоты понимания я использую двоичное представление для литеральных примеров.Использование десятичного (любое основание) не влияет на результат операции.
простая операция
Простые операции, как следует из названия, используют одновременно только одного оператора.
&: Побитовое И
Правила управления:1, если оба равны 1, иначе 0. Выход равен 1, только если оба операнда равны 1, и 0 в противном случае.
Примечание: 1. Все литеральные значения в этом примере (то же самое ниже) выражены в десятичном виде, пожалуйста, используйте двоичное мышление, чтобы понять, когда понимаете; 2. В этой статье не будет описываться битовая операция между отрицательными числами.
@Test
public void test() {
int i = 0B100; // 十进制为4
int j = 0B101; // 十进制为5
// 二进制结果:100
// 十进制结果:4
System.out.println("二进制结果:" + Integer.toBinaryString(i & j));
System.out.println("十进制结果:" + (i & j));
}
|: побитовое ИЛИ
Правила эксплуатации:0, если оба равны 0, иначе 1. Только когда обе операнды 0, только выходной результат 0.
@Test
public void test() {
int i = 0B100; // 十进制为4
int j = 0B101; // 十进制为5
// 二进制结果:101
// 十进制结果:5
System.out.println("二进制结果:" + Integer.toBinaryString(i | j));
System.out.println("十进制结果:" + (i | j));
}
~: побитовое НЕ
Правила эксплуатации:0 равно 1, 1 равно 0. Все 0 устанавливаются в 1, а 1 устанавливаются в 0.
Советы: обратите внимание на все из них, не игнорируйте 0 перед положительными числами~
@Test
public void test() {
int i = 0B100; // 十进制为4
// 二进制结果:11111111111111111111111111111011
// 十进制结果:-5
System.out.println("二进制结果:" + Integer.toBinaryString(~i));
System.out.println("十进制结果:" + (~i));
}
^: Побитовые хор
Правила эксплуатации:То же, что 0, отличается от 1. Когда операнды разные (1 встречается с 0, 0 встречается с 1), соответствующий выходной результат равен 1, в противном случае он равен 0.
@Test
public void test() {
int i = 0B100; // 十进制为4
int j = 0B101; // 十进制为5
// 二进制结果:1
// 十进制结果:1
System.out.println("二进制结果:" + Integer.toBinaryString(i ^ j));
System.out.println("十进制结果:" + (i ^ j));
}
Правила эксплуатации: поставить рядвсе цифрысмещены на несколько позиций влево.
@Test
public void test() {
int i = 0B100; // 十进制为4
// 二进制结果:100000
// 十进制结果:32 = 4 * (2的3次方)
System.out.println("二进制结果:" + Integer.toBinaryString(i << 2));
System.out.println("十进制结果:" + (i << 3));
}
сдвиг влевоиспользовал много, понять не сложно. Сдвиньте x влево на N бит, эффект такой же, как умножение N-й степени 2 непосредственно в десятичном виде, но нужно обратить внимание на значениепереполнениеситуации, пожалуйста, будьте осторожны при его использовании.
>>: побитовый сдвиг вправо
Правила эксплуатации: поставить рядвсе цифрысдвинуты на несколько позиций вправо.
@Test
public void test() {
int i = 0B100; // 十进制为4
// 二进制结果:10
// 十进制结果:2
System.out.println("二进制结果:" + Integer.toBinaryString(i >> 1));
System.out.println("十进制结果:" + (i >> 1));
}
Сдвиг отрицательных чисел вправо:
@Test
public void test() {
int i = -0B100; // 十进制为-4
// 二进制结果:11111111111111111111111111111110
// 十进制结果:-2
System.out.println("二进制结果:" + Integer.toBinaryString(i >> 1));
System.out.println("十进制结果:" + (i >> 1));
}
Сдвиг вправо также используется все более и более понятно: операция на самом деле является двоичным числомправые N битнепосредственныйотрезать,Потом正数右移高位补0,负数右移高位补1
.
>>>: сдвиг вправо без знака
Примечание: нет беззнакового сдвига влево, и нет
<<<
этот символ
это и>>
Разница между сдвигом вправо со знаком заключается в том, является ли это положительным или отрицательным числом,Старший бит проходит для заполнения 0. Так что для положительных чисел разницы нет, тогда посмотрите на производительность для отрицательных чисел:
@Test
public void test() {
int i = -0B100; // 十进制为-4
// 二进制结果:11111111111111111111111111111110(>>的结果)
// 二进制结果:1111111111111111111111111111110(>>>的结果)
// 十进制结果:2147483646
System.out.println("二进制结果:" + Integer.toBinaryString(i >>> 1));
System.out.println("十进制结果:" + (i >>> 1));
}
Я намеренно поместил результаты >> выше для вашего удобства. Поскольку старший бит заполнен 0, он не отображается, но вы должны знать, что происходит в вашем сердце.
составная операция
Составные операции в широком смысле относятся к множественным операциям.вложенный, обычно эти операции однотипны. Упомянутая здесь составная операция относится к использованию знака =, подобно+= -=
. Изначально это относится к элементарному здравому смыслу и не нуждается в отдельном объяснении, но кто бы позволил Брату А заняться добычей, убить и закопать😄.
Смешанная операция: Относится к одной и той же формуле, содержащей различные операторы, такие как сложение, вычитание, умножение, деление, возведение в степень и так далее.
Возьмем операцию & и в качестве примера, остальные аналогичны:
@Test
public void test() {
int i = 0B110; // 十进制为6
i &= 0B11; // 效果同:i = i & 3
// 二进制结果:10
// 十进制结果:2
System.out.println("二进制结果:" + Integer.toBinaryString(i));
System.out.println("十进制结果:" + (i));
}
рассмотрение&
Правила эксплуатации таковы:1, если оба равны 1, иначе 0.
Пример сценариев использования битовых операций
побитовые операции, кромеэффективныйЕсть еще одна особенность, которую нельзя игнорировать в сценариях применения:Вычислительная обратимость. С помощью этой функции мы можем использовать для достижениясекретные данныеэффект, а также обеспечить эффективность.
В исходном коде JDK. Есть много начальных значений, которые вычисляются побитовыми операциями. Самый типичный пример — HashMap:
HashMap:
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
static final int MAXIMUM_CAPACITY = 1 << 30;
Битовые операции имеют много хороших свойств, которые можно использовать вЛинейный ростфункция в данных. А для некоторых операций битовые операции являются самым прямым и простым способом. Ниже я привожу несколько конкретных примеров (обычно вопросы интервью) и прощупываю.
Проверить, имеют ли два числа одинаковый знак
И положительные, и отрицательные числа одинаковы, в противном случае они разные. Небольшой регистр, подобный этому, добавляется в десятичном формате.>/<
Компараторы, конечно, могут это сделать, но проще (и эффективнее) сделать это с побитовыми операторами:
@Test
public void test4() {
int i = 100;
int j = -2;
System.out.println(((i >> 31) ^ (j >> 31)) == 0);
j = 10;
System.out.println(((i >> 31) ^ (j >> 31)) == 0);
}
Запускаем программу, выводим:
false
true
Всего тип int имеет 32 бита, и если его сдвинуть вправо на 31 бит, останется только 1 бит знака (потому что этоДвигайтесь вправо со знаком, поэтому положительное число остается с 0, а отрицательное число остается с 1), а затем выполните два бита знака^
Результат операции XOR равен 0, что указывает на то, что они непротиворечивы.
рассмотрение
^
Правила операции XOR:То же, что 0, отличается от 1.
Определить четность числа
В десятичных числах это можно сделать, взяв остаток с 2. Для битовых операций есть болееэффективныйПуть:
@Test
public void test5() {
System.out.println(isEvenNum(1)); //false
System.out.println(isEvenNum(2)); //true
System.out.println(isEvenNum(3)); //false
System.out.println(isEvenNum(4)); //true
System.out.println(isEvenNum(5)); //false
}
/**
* 是否为偶数
*/
private static boolean isEvenNum(int n) {
return (n & 1) == 0;
}
Зачем&1
Можно ли определить пару оснований? потому что в двоичном форматеПоследняя цифра четного числа должна быть 0, а младшая цифра нечетного числа должна быть 1..
Все первые 31 бит двоичной единицы равны 0, поэтому они находятся в первых 31 битах других чисел.И операцияПосле подтверждения того, что все цифры равны 0 (будь то 1 и 0 или 0 и 0, результат равен 0), единственная разница состоит в том, чтобы посмотреть на результат операции И между самой младшей цифрой и 1: результат равен 1 для нечетных чисел, в противном случае результат равен 0 для четных чисел.
Поменять местами значения двух чисел (без использования сторонних переменных)
Это старый вопрос на собеседовании, поменяйте местами значения A и B. Если в этом вопросе нет слов в скобках, это вопрос, который всем известен, и его можно решить так:
@Test
public void test6() {
int a = 3, b = 5;
System.out.println(a + "-------" + b);
a = a + b;
b = a - b;
a = a - b;
System.out.println(a + "-------" + b);
}
Запуск программы, вывод (успешный обмен):
3-------5
5-------3
Самым большим преимуществом использования этого метода является то, что его легко понять. Самые большие минусы это:a+b, может превышать максимальный диапазон типа int, что приводит к потере точности и ошибкам, что приводит к очень скрытым ошибкам.. Поэтому, если вы используете его в такой производственной среде, он будет иметь относительно большой риск для безопасности.
Совет: если вы оцениваете цифрыневозможныйПревышение максимального значения допустимо. Конечно, если вы строковый тип, пожалуйста, действуйте так, как будто я не говорил
Потому что этот метод не только вводит сторонние переменные, но и имеет серьезные риски для безопасности. Итак, в этой статье представлена безопасная альтернатива с использованием побитовых операций.обратимостьдля завершения операции:
@Test
public void test7() {
// 这里使用最大值演示,以证明这样方式是不会溢出的
int a = Integer.MAX_VALUE, b = Integer.MAX_VALUE - 10;
System.out.println(a + "-------" + b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a + "-------" + b);
}
Запуск программы, вывод (подкачка выполнена успешно):
2147483647-------2147483637
2147483637-------2147483647
Поскольку полный текст не выполняет операции сложения над a/b, переполнение не может произойти, поэтому это безопасно. Основное обоснование этого подхода заключается в следующем:Обратимость побитовых операций, используйте XOR для достижения цели.
Побитовые операции с полями базы данных (важно)
Этот вариант использованияочень сильноПрактическое значение приложения, потому что я много раз использовал его в производстве, и в целом это не очень хорошо.
Смущающее явление проектирования баз данных в бизнес-системах: обычно наша таблица данных может содержать различные атрибуты состояния.Например, в таблице блога нам нужно поле, чтобы указать, является ли он общедоступным, установлен ли пароль, является ли он заблокирован админом, и заблокирован ли он админом.Верх и тд.Также будет сталкиваться с тем, что при последующей эксплуатации и обслуживании планирование требует добавления новых функций, и вам необходимо добавить новые поля., это вызовет трудности в последующем обслуживании, слишком много полей и увеличится индекс.В это время можно использовать битовые операции.Умнаярешить.
Например: когда мы выполняем аутентификацию и авторизацию на веб-сайте, мы обычно поддерживаем несколько методов авторизации, таких как:
- Персональная аутентификация 0001 -> 1
- Аутентификация электронной почты 0010 -> 2
- Аутентификация WeChat 0100 -> 4
- Сертификация Super Tube 1000 -> 8
Таким образом, мы можем использовать1111
Эти четыре цифры используются для подтверждения подлинности их соответствующих позиций. Условный оператор для запроса аутентификации WeChat выглядит следующим образом:
select * from xxx where status = status & 4;
Чтобы запросить как личную аутентификацию, так и аутентификацию WeChat:
select * from xxx where status = status & 5;
Конечно, у вас также могут быть требования к сортировке, например:
select * from xxx order by status & 1 desc
Этот случай такой же, как и всем знакомый в Linux контроль разрешений, он управляется с помощью битовых операций: разрешения делятся на r чтение, w запись и x выполнение, где их веса равны 4, 2 и 1 соответственно. Вы можете произвольно комбинировать авторизации. Напримерchomd 7
, то есть 7=4+2+1 означает, что у этого пользователяrwxразрешения,
Меры предосторожности
- Вам нужно, чтобы ваше хранилище БД поддерживало битовые операции, например, MySql поддерживает это.
- Пожалуйста, убедитесь, что ваш тип поля не является типом char, он должен бытьТип номера
- Таким образом, это приведет каннулирование индекса, но вообще значение состояния не нуждается в индексе
- Конкретный анализ конкретного дела, не используйте его слепо для галочки, при неправильном использовании его легко подвергнуть критике и критике.
Генератор серийных номеров (генератор номеров заказов)
Сгенерировать серийный номер заказа, конечно, это не сложная функция, самый прямой способ - склеить серийный номер с датой + идентификатором хоста + случайной строкой, и даже увидеть много мест, использующих UUID напрямую, конечно, это очень не рекомендуется.
UUID — это слишком длинная и беспорядочная строка, которая не может нести достоверную информацию и, следовательно, не может обеспечить эффективную помощь в решении проблем с позиционированием, поэтому обычно это альтернативное решение.
Сегодня я изучил битовые операции и думаю, что есть более элегантный способ сделать это. Что такое элегантность: вы можете обратиться к номерам заказов Taobao и Jingdong,Это похоже на правило, но это не так.:
- Я не хочу раскрывать соответствующую информацию напрямую.
- Благодаря серийному номеру вы можете быстро получить соответствующую бизнес-информацию и быстро найти проблему (это очень важно, и это самая важная причина, по которой UUID не рекомендуется).
- Использование AtomicInteger может увеличить параллелизм и уменьшить количество конфликтов (это еще одна важная причина не использовать UUID, поскольку числа более эффективны, чем строки).
Введение в принципы реализации
Этот серийный номер состоит из: длинной строки чисел, состоящей из значения типа date+Long, например,2020010419492195304210432
. Очевидно, что передняя часть — это данные даты, а длинная строка позади содержит множество значений: текущая секунда, идентификатор продавца (или остальные ваши бизнес-данные), идентификатор машины, строка случайных кодов и т. д. .
Введение каждой части:
- Первая часть представляет собой миллисекундное значение текущего времени. Максимум 999, значит занимает 10 мест
- Вторая часть: serviceType представляет тип бизнеса. Например, номер заказа, серийный номер операции, серийный номер потребления и т. д. Максимальное значение установлено на 30,достаточно. 5 мест
- Третья часть: shortParam, которая представляет определяемый пользователем короткий параметр. Параметры категории, такие как тип заказа, тип операции и т. д., могут быть размещены. Максимальное значение установлено на 30, чего точно достаточно. 5 мест
- Четвертая часть: longParam, там же. Обычно пользователи могут указывать параметры идентификатора, такие как идентификатор пользователя, идентификатор продавца и т. д., а максимальная поддержка составляет 999,99 миллиона. Большинству из них достаточно, составляя 30
- Часть 5: Остальные цифры присваиваются случайным числам, и число генерируется случайным образом, чтобы заполнить оставшиеся цифры. Обычно остается не менее 15 бит (Эта часть количества цифр плавает), поэтому достаточно поддерживать параллелизм 2 в 15-й степени.
- Наконец, добавьте дату и время (год, месяц, день, часы, минуты, секунды) перед указанным выше длинным значением.
Это инструмент генерации серийных номеров, основанный на битовой операции, написанный Brother A, который использовался в производственной среде. Учитывая, что исходник длинный (файл, всего около 200 строк, без каких-либо других зависимостей), выкладывать его не буду.Пожалуйста, перейдите за кулисы общедоступного аккаунта, чтобы ответить流水号生成器
Получите это бесплатно.
✍Резюме
битовые операции винженерная точка зренияЕсть еще довольно много недостатков.В реальной работе, если это только для вычисления чисел, не рекомендуется использовать побитовые операторы.Есть только некоторые специальные сценарии.Использование побитовых операций для этого даст вам темную и яркие чувства, такие как:
- Многоуровневое управление N требует масштабируемости. например база данныхположение делполевой дизайн
- К эффективности предъявляются высокие требования. Например JDK
- Сцена подходит идеально. Например, значение PIN-кода функции Джексона
Не используйте его ради ослепительных (чжуан) умений (би), ослепительные умения какое-то время будут крутыми, и попадут в крематорий, парень еще молод, и я надеюсь, вы осторожничаете. Код в большинстве случаевБолее важно, чтобы люди могли легко читать, чем машины..
✔ Рекомендуемое чтение:
- Fastjson пора прощаться
- 1. Сначала встретился Джексон - лучшая в мире библиотека JSON
- 2. Боже, Джексон раньше писал JSON вот так
- 3. Зная это, Фан Ган сказал в своем резюме, что он будет использовать Джексона для написания JSON.
- 4. Как анализируются строки JSON? JsonParser для понимания
- 5. JsonFactory это просто фабрика, вполне ожидаемо, такого я не ожидал
- 6. Двадцать не путается, ObjectMapper больше не путается
♥Следуйте за братом А♥
Author | Брат А (Ваш Бэтмен) |
---|---|
персональный сайт | www.yourbatman.cn |
yourbatman@qq.com | |
fsx641385712 | |
活跃平台 |
|
Нет публики | Утопия летучих мышей (ID: утопия летучих мышей) |
планета знаний | Утопия BAT |
Рекомендуемые статьи дня | Рекомендуемые статьи дня |