Не видел этого вопроса раньше, и похоже, что @Romain обратился к нему.
Для полноты рабочий пример того, как это сделать, когда все стороны играют, предоставляется xts
и RcppXts
. В xts
мы делаем это (около десяти функций) в файле (source) inst/include/xtsAPI.h
:
SEXP attribute_hidden xtsLag(SEXP x, SEXP k, SEXP pad) {
static SEXP(*fun)(SEXP,SEXP,SEXP) = NULL;
if (fun == NULL)
fun = (SEXP(*)(SEXP,SEXP,SEXP)) R_GetCCallable("xts","lagXts");
return fun(x, k, pad);
}
вместе с обычной работой R_registerRoutines
и R_RegisterCCallable
.
В RcppXts
это подбирается (в модуле Rcpp) как
function("xtsLag",
&xtsLag,
List::create(Named("x"), Named("k"), Named("pad")),
"Extract the coredata from xts object");
, который работает очень хорошо. Кто-то сделал мне выговор, чтобы написать xts
сторону более компактно (поскольку if NULL
является ложным), который я получу ... в конце концов.
В наши дни большинство компьютеров используют дополнение до двух для целых чисел со знаком, но оно может варьироваться в зависимости от архитектуры оборудования, языка программирования или других проблем, связанных с платформой.
Для представления с дополнением до двух старший значащий («крайний левый») бит называется битом знака , и он будет установлен для отрицательного целого числа и сброшен для неотрицательного целое число. Однако это больше, чем просто «флаг». См. статью Википедии для получения дополнительной информации.
Из стандарта C99:
Для знаковых целочисленных типов, биты представления объекта должны быть разделены на три группы: биты значения, биты подстановки и бит знака. Здесь не должно быть никаких битов прокладки; должен быть должен быть ровно один бит знака. Каждый бит, являющийся битом значения, должен иметь то же значение, что и тот же бит в объектном представлении соответствующего беззнакового типа (если есть M битов значения в знаковом типе и N в беззнаковом типе, то M = N). Если бит знака равен нулю, то это не должно не влияет на результирующее значение. Если бит знака равен единице, то значение должно быть модифицировано одним из следующих способов:
- соответствующее значение с битом знака бит 0 отрицается (знак и величина);
- бит знака имеет значение -(2N) (дополнение двух);
- бит знака имеет значение -(2N - 1) (дополнение единицы).
Что из этого применимо определяется реализацией, как и то, будет ли значение со знаковым битом 1 и всеми биты значения нулевые (для первых двух), или со знаковым битом и всеми битами значения 1 (для дополнения единицы), является ловушкой или обычным значением. В случае знака и величины и дополнения единицы, если это представление является нормальным значением, оно называется отрицательным нулем.
Старший бит (последний бит слева) устанавливается для отрицательных чисел.
0xFFFFFFFF = -1
0xFFFFFFFE = -2
0xFFFFFFFD = -3
...
и так далее