- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
#include <stdio.h>
int main() {
unsigned d,t,k;
scanf("%d",&d);
t=d;
for(k=0;t!=0;k++) //определяем кол-во значащих битов
t>>=1;
//обнуляем старший значащий бит
d<<=sizeof(d)*8-k+1;
d>>=sizeof(d)*8-k+1;
return 0;
}
или
после такиз говнокодов начинаешь задумыватся о удобстве и легкости ассемблера ))
UPD: Хотя бы на асме
d <<= k;
d >>= k;
пожалуйста 3 строки
bsr eax,cl
jz skip ;если eax=0
btr eax,cl
skip: ....
Как говорится
Use asm Luke
bsf and bsr instructions scan a word or double word for first set bit and store the index of this bit into destination operand, which must be general register. The bit string being scanned is specified by source operand, it may be either general register or memory. The ZF flag is set if the entire string is zero (no set bits are found); otherwise it is cleared.
Тока там явно не CL.
ага, это я на автомате как я юзаю в shr написал
и еще там jz skip по большому счету не сильно нужен
Хотя признаюсь, сам я данной инструкцией ниразу в жизни не пользовался и может просто не знаю о существовании каких-нибудь "подземных камней", как например со скоростью работы "repe" на современных компьютерах.
https://en.m.wikipedia.org/wiki/Find_first_set
https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Other-Builtins.html#Other-Builtins
использовался тот факто что если от числа отнять 1 и сделать xor с оригиналом то получится (почти) маска для следующего установленого бита. откусывая от числа нижние установленые биты, в цикле доходится до последнего установленого. и число итераций равно числу установленых битов.
Хоть и не многим лучше, но на CeleronM работает ощутимо быстрее.
или в 2 строчки:
Откуда это? Или это собственный алгоритм?
http://graphics.stanford.edu/~seander/bithacks.html
P.S.: Я смотрю, там немало очень интересных приёмов.
– с одной стороны, мы тут все не программисты, а, с другой, хули ты тут забыл тогда?
Первое магическое число — это смещенная экспонента 52 (2**(11-1)-1+52)=1075=0x433
Второе магическое число — это 2**52 в формате дабла, можно написать как (double)(1LL<<52), тогда не так страшно.
При таком способе, как мы положили число в дабл, оно все равно что получило старший бит (мы его по стандарту не пишем, потому что в нормализованном виде старший бит всегда равен единице), мы его вычитаем (2**52), и вуаля, оно нормализуется. Сдвигаем экспоненту на 20 бит (чтобы она встала на место в старшем слове). Последнее вычитание — это достать экспоненту из смещенной.
Как-то так:)
Я привел лишь еще один вариант решения, применять на практике которое я не призывал )
Нил был в лиспе, когда твои родители еще не родились.
Из лиспа он перекочевал в смалток и в паскаль
Из смалтока и лиспа в руби
Из смалкота в ObjC
из ObjC в Swift
Впринципе, любое Null-говно есть только в Си и его наследниках.
Скорее всего это из симулы пошло, но я не уверен
нил круче нула
киля азиров не даст соврать
Начиная с c99 пока не возникало необходимости использовать int (кроме конечно случаев когда он явно указан в сигнатуре функции)
Бывает размер рабочих регистров, максимальный размер ближнего указателя (в случае сегментной адресации), разрядность шины памяти в конце концов (это важно для выравнивания)
У 8088/8086 регистры общего назначения были 16-битными, однако, были инструкции, работающие с 8 битами (половинки типа AH и AL) и с 32 битами (когда аргумент или результат в паре регистров DX+AX), длинные указатели были 32 битными, однако линейный адрес в памяти был 20-битным, а вот размер адреса порта был 10-битным. А у математического сопроцессора регистры были 80-битными, однако, их можно было использовать как 64- и 32-битные.
AX -- 16
EAX -- 32
RAX -- 64
(причем под словом "полностью 32-х разрядная ОС" в моем детстве например понимали "ОС с поддержкой пейнджинга" -- то-есть ос, требующая 386)
Но как это мапится на другие процессоры?
Утверждать, что процессоры бывают "32-х битные и 64-х битные" потому, что так бывало у Intel, это как утверждать, что языки программирования бывают "вторые" и "третьи" (потому что так было у пайтона)
had in mind was an Intel 386SX-based system with 4 MB of memory, a
VGA display, and 80 MB of disk space.
Windows applications relies on allocated resources remaining available
even after the application quits. For this reason, the resource cleanup
can't take place until the system notices that there are no 16-bit applications running.
Какой ротоёб'92
compatibility toolkit же
https://govnokod.xyz/_11319/#comment-388889