- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
#define BITS 8
typedef union
{
int v;
struct
{
#define FIELD(x,_) int b##x:1;
EVAL(REPEAT(BITS, FIELD, ~))
#undef FIELD
};
} Num;
Num shl(Num n, int carry)
{
#define SHIFTL(x,_) CAT(n.b, CAT(x = n.b, CAT(DEC_,x)));
EVAL(RREPEAT(BITS, SHIFTL, ~))
#undef SHIFTL
n.b0 = carry;
}
Num shr(Num n, int carry)
{
#define SHIFTR(x,_) CAT(n.b, CAT(CAT(DEC_,x) = n.b, x));
EVAL(REPEAT(BITS, SHIFTR, ~))
#undef SHIFTR
CAT(n.b, CAT(DEC_,BITS)) = carry;
}
int main()
{
for (int i=0; i<33; ++i){
Num n = {i};
Num n1 = shl(n,0);
Num n2 = shr(n,0);
printf("%d %d %d\n",n ,n1 , n2);
}
}
3.14159265 21.07.2022 17:33 # 0
Имея сложение это тривиально: a+a. Но мы пытаемся реализовать саму операцию сложения.
А реализовать сам сдвиг на самых тривиальных побитовых операциях нельзя, поскольку они не меняют положение битов.
Так же не подходят всякие способы обхода циклом, т.к. в нём тоже есть операция инкремента.
for (int i=0; i<8; ++i){
3.14159265 21.07.2022 17:35 # 0
guest6 21.07.2022 17:40 # 0
3.14159265 21.07.2022 17:53 # 0
#pragma pack(push,1) и гетигп н
Легким движением компилятора макрусня превращается... превращается макрусня ... макрусня превращается...
В элегантные шифты!
Шланг: https://godbolt.org/z/dMah4erfs
А вот гцц обосрался:
https://godbolt.org/z/qafnPYeT1
3.14159265 21.07.2022 18:10 # 0
KOHCOjlbHblu_nemyx 21.07.2022 20:08 # 0