博客里只有代码部分,位运算和浮点表示真妙!
2.55
#include <stdio.h>
#include <string.h>
typedef unsigned char * byte_pointer;
void show_byte(byte_pointer x, int len) {
for(int i = 0; i < len; i++)
printf("%.2x ", x[i]);
printf("\n");
}
void show_int() {
int num = 8;
byte_pointer bp = (byte_pointer)#
show_byte(bp, sizeof(int));
}
void show_double() {
double num = 3.1415926535;
byte_pointer bp = (byte_pointer)#
show_byte(bp, sizeof(double));
}
void show_short() {
short num = 8;
byte_pointer bp = (byte_pointer)#
show_byte(bp, sizeof(short));
}
int main() {
show_int();
show_double();
show_short();
return 0;
}
2.58
#include <stdio.h>
#include <stdint.h>
#include <iostream>
using namespace std;
typedef unsigned char * byte_point;
int is_little_endian() {
int32_t num = 1;
byte_point bp = (byte_point)#
printf("%s\n", bp);
cout << *bp << endl;
printf("%d\n", num);
if(*bp)
return 1;
else
return 0;
}
int main() {
printf("%d\n", is_little_endian());
}
2.59
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char * byte_point;
void show_byte(int x, int len) {
byte_point bp = (byte_point)&x;
for(int i = 0; i < len; i++)
printf("%.2x ", bp[i]);
printf("\n");
}
byte_point change(int x, int y) {
byte_point bx = byte_point(&x);
byte_point by = byte_point(&y);
byte_point bz = (byte_point)malloc(sizeof(int));
for(int i = 0; i < sizeof(int); i++) {
if(i == 0)
*bz = *bx;
else
*(bz + i) = *(by + i);
}
return bz;
}
int main() {
int x = 0x89abcdef;
int y = 0x76543210;
printf("%d %d\n", x, y);
byte_point z = change(x, y);
show_byte(x, sizeof(int));
show_byte(y, sizeof(int));
for(int i = 0; i < sizeof(int); i++)
printf("%.2x ", z[i]);
// show_byte(z, sizeof(int));
return 0;
}
2.60
#include <stdio.h>
unsigned replace_byte(unsigned x, int i, unsigned char b) {
int move = i << 3;
return (x & ~(0xFF << move) | b << move);
}
int main() {
int x = 0x12345678;
printf("0x%.8X\n", replace_byte(x, 2, 0xAB));
printf("0x%.8X\n", replace_byte(x, 0, 0xAB));
return 0;
}
2.61
#include <iostream>
int main() {
int move = (sizeof(int) - 1) << 3;
//全为1输出1,否则输出0
int x = 0x0;
int y = 0xffffffff;
printf("%d %d\n", !(x ^ ~0x0), !(y ^ ~0x0));
printf("%d %d\n", !(~x), !(~y));
//全为0输出1
printf("%d %d\n", !(x ^ 0), !(y ^ 0));
printf("%d %d\n", !x, !y);
//最低有效字节全为1输出1
printf("%d %d\n", !(~(x & 0xff) << move), !(~(y & 0xff) << move));
//最高有效字节全为0输出1
printf("%d %d\n", !(x >> move), !(y >> move));
printf("%d\n", y >> move);
return 0;
}
2.62
#include <stdio.h>
bool int_shifts_are_arithmetic() {
int x = 0x80000000;
return (x >> 30) & 8;
}
int main() {
printf("%d", int_shifts_are_arithmetic());
return 0;
}
2.63
#include <stdio.h>
signed srl(unsigned x, int k) {
unsigned xsra = (int)x >> k;
int obj = ~(((1 << k) - 1) << ((sizeof(int) << 3) - k));
return xsra & obj;
}
signed sra(int x, int k) {
int xsrl = (unsigned) x >> k;
int sum = sizeof(int) << 3;
int judge = 1 << (sum - 1 - k);
judge &= xsrl;
int obj = ~(judge - 1);
return xsrl | obj;
}
int main() {
printf("%.8x\n", srl(0x81001100, 4));
printf("%.8x\n", sra(0x81001100, 4));
return 0;
}
2.64
#include <stdio.h>
int any_odd_one(unsigned x) {
unsigned obj = 0x55555555;
return !!(x & obj);
}
int main() {
unsigned x = 0x00000001;
printf("%d\n", any_odd_one(x));
return 0;
}
2.65
#include <iostream>
int odd_ones(unsigned x) {
int w = sizeof(int) << 3;
x ^= x >> 16;
x ^= x >> 8;
x ^= x >> 4;
x ^= x >> 2;
x ^= x >> 1;
return x & 1;
}
int main() {
int a = 0xffff0000;
int b = 0x00000103;
printf("%d %d", odd_ones(a), odd_ones(b));
return 0;
}
2.66
#include <stdio.h>
int leftmost_one(int x) {
int w = sizeof(int) << 3;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x & ((~x) >> 1 | 0x80000000);
}
int main() {
int a = 0xff000000;
int b = 0x00000040;
printf("%.8x %.8x\n", leftmost_one(a), leftmost_one(b));
return 0;
}
2.67
#include <stdio.h>
int bad_int_size_is_32() {
int set_msb = 1 << 31;
int beyond_msb = set_msb << 1;
return set_msb && !beyond_msb;
}
int bad_int_size_is_32_in16() {
int set_msb = 1 << 15;
set_msb <<= 15;
set_msb <<= 1;
int beyond_msb = set_msb << 1;
return set_msb && !beyond_msb;
}
int main() {
printf("%d\n", bad_int_size_is_32());
printf("%d\n", bad_int_size_is_32_in16());
return 0;
}
2.68
#include <stdio.h>
int lower_one_mask(int x) {
int w = sizeof(int) << 3;
return (unsigned)-1 >> (w - x);
}
int main() {
int a = 6;
int b = 17;
printf("%.8x\n", lower_one_mask(a));
printf("%.8x\n", lower_one_mask(b));
return 0;
}
2.69
#include <stdio.h>
unsigned rotate_left(unsigned x, int n) {
int w = sizeof(int) << 3;
unsigned ans = x;
ans <<= n;
ans |= x >> (w - n);
return ans;
}
int main() {
int a = 0x12345678;
int x1 = 0;
int x2 = 20;
printf("0x%.8x\n", rotate_left(a, x1));
printf("0x%.8x\n", rotate_left(a, x2));
return 0;
}
2.70
#include <stdio.h>
#include <limits.h>
int fits_bits(int x, int n) {
int w = sizeof(int) << 3;
int obj = x << (w - n) >> (w - n);
return obj == x;
}
int main() {
int x = 0x00000011;
int n = 1;
printf("%d\n", fits_bits(x, n));
printf("%d\n", fits_bits(INT_MAX, 32));
printf("%d\n", fits_bits(0, 0));
return 0;
}
2.71
#include <stdio.h>
typedef unsigned packed_t;
int xbyte(packed_t word, int bytenum) {
int w = bytenum + 1 << 3;
return (int)word << (32 - w) >> (3 << 3);
}
int main() {
int word = 0xf1f2f380;
printf("%.8x\n", xbyte(word, 0));
printf("%.8x\n", xbyte(word, 1));
printf("%.8x\n", xbyte(word, 2));
printf("%.8x\n", xbyte(word, 3));
return 0;
}
2.72
#include <stdio.h>
void copy_int(int val; void *buf, int maxbytes)
{
if(maxbytes < 0)
return;
if (maxbytes >= sizeof(val))
memcpy(buf, (void*) &val, sizeof(val));
}
2.73
#include <stdio.h>
#include <limits.h>
int saturating_add(int x, int y) {
int w = sizeof(int) << 3;
int is_diff_sign = (x ^ y) >> (w - 1);
int is_overflow = ((x + y) ^ x) >> (w - 1);
int judge = x >> (w - 1);
// printf("%d %d %d\n", is_diff_sign, is_overflow, judge);
// printf("%d\n", is_diff_sign & (x + y));
int a = (is_diff_sign & (x + y));
int b = ( (~is_diff_sign & ((~is_overflow & (x + y)) + (is_overflow & (judge & INT_MIN + ~judge & INT_MAX)))));
int c= ((is_diff_sign & (x + y)) + (~is_diff_sign & ((~is_overflow & (x + y)) + (is_overflow & ((judge & INT_MIN) + (~judge & INT_MAX))))));
//printf("%d %d %d\n", a, b, c);
return c;
}
int main() {
printf("%d\n", saturating_add(1, 100));
printf("%d\n", saturating_add(1000, -10));
printf("%d\n", saturating_add(INT_MAX, 12321));
printf("%d\n", saturating_add(INT_MIN, -1));
return 0;
}
2.74
#include <stdio.h>
#include <limits.h>
int tsub_ok(int x, int y) {
y = -y;
int w = sizeof(int) << 3;
int same = (x ^ y) >> (w - 1);
int overflow = ((x + y) ^ x) >> (w - 1);
return same || !overflow;
}
int main() {
printf("%d\n", tsub_ok(INT_MIN, 1));
printf("%d\n", tsub_ok(-1, 100));
printf("%d\n", tsub_ok(-23,INT_MAX));
return 0;
}
2.75
#include <stdio.h>
#include <limits.h>
#include <inttypes.h>
int signed_high_prod(int x, int y) {
int64_t high_prod = (int64_t)x * y;
return high_prod >> 32;
}
unsigned unsigned_high_prod(unsigned x, unsigned y) {
int w = sizeof(int) << 3;
int bit_x = x >> (w - 1);
int bit_y = y >> (w - 1);
int sig_high = signed_high_prod(x, y);
return sig_high + x * bit_y + y * bit_x;
}
unsigned unsigned_high_prod_two(unsigned x, unsigned y) {
uint64_t high_prod = (uint64_t)x * y;
return high_prod >> 32;
}
int main() {
unsigned x = 0xffffffff;
unsigned y = 0x12345678;
printf("%.8x\n", unsigned_high_prod(x, y));
printf("%.8x\n", unsigned_high_prod_two(x, y));
return 0;
}
2.76
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
void *calloc(size_t nmemb, size_t size) {
if(!nmemb || !size)
return NULL;
// return (int*)malloc(sizeof(int) * size);
size_t size_sum = nmemb * size;
if(nmemb == size_sum / size) {
void *ptr = malloc(size_sum);
memset(ptr, 0, size_sum);
return ptr;
}
else
return NULL;
}
int main() {
void *p = calloc(123, 1);
if(p == NULL) {
printf("P = NULL\n");
}
else
free(p);
return 0;
}
2.77
#include <stdio.h>
#include <stdlib.h>
int mul1(int x) {
return (x << 4) + x;
}
int mul2(int x) {
return x - (x << 3);
}
int mul3(int x) {
return (x << 6) - (x << 2);
}
int mul4(int x) {
return (x << 4) - (x << 7);
}
int main() {
int x = 10;
printf("%d\n", mul1(x));//*17
printf("%d\n", mul2(x));//*-7
printf("%d\n", mul3(x));//*60
printf("%d\n", mul4(x));//*-112
return 0;
}
2.78
#include <stdio.h>
#include <limits.h>
int divide_power2(int x, int k) {
int w = sizeof(int) << 3;
int sign = x >> (w - 1);
int bias = (1 << k) - 1;
return (~sign & (x >> k)) + (sign & (x + bias) >> k);
}
int main() {
printf("%d\n", divide_power2(51, 1));
printf("%d\n", divide_power2(-51, 1));
return 0;
}
2.79
#include <stdio.h>
#include <limits.h>
int mul3div4(int x) {
int w = sizeof(int) << 3;
x = (x << 1) + x;
int sign = x >> (w - 1);
int bias = (1 << 2) - 1;
return (~sign & (x >> 2)) + (sign & ((x + bias) >> 2));
}
int main() {
printf("%d\n", mul3div4(3));
printf("%d\n", mul3div4(4));
return 0;
}
2.80
#include <stdio.h>
#include <limits.h>
int threefourths(int x) {
int w = sizeof(int) << 3;
int sign = x >> (w - 1);
int bias = (1 << 2) - 1;
x = (~sign & (x >> 2)) + (sign & (x + bias) >> 2);
return (x << 1) + x;
}
int main() {
printf("%d\n", threefourths(4));
printf("%d\n", threefourths(5));
printf("%d\n", threefourths(-5));
return 0;
}
2.81
#include <stdio.h>
int A(int k) {
return (-1) << k;
}
int B(int k, int j) {
return ~A(k) << j;
}
int main() {
printf("%.8x\n", A(4));
printf("%.8x\n", B(8, 4));
return 0;
}
2.82
#include <stdio.h>
#include <stdlib.h>
/*A错。x = INT_MIN, y = 0*/
/*B对 LEFT = ((((((x+y)mod)*16)mod)+y)mod)-x)mod = (17y + 15x)mod. RIGHT = (17*y)mod + (15*x)mod = (17y + 15x)mod.*/
void B() {
int x = INT_MAX;
int y = -1e9;
printf("%d %d\n", ((x + y) << 4) + y - x, 17 * y + 15 * x);
}
int main() {
B();
int x = INT_MIN;
printf("%d %d", x, -x);
return 0;
}
2.84
#include <stdio.h>
int float_le(float x, float y) {
unsigned ux = f2u(x);
unsigned uy = f2u(y);
unsigned sx = ux >> 31;
unsigned sy = uy >> 31;
return sx == sy ? (sx == 0 ? ux <= uy : ux >= uy) : sx > sy;
}
int main() {
return 0;
}
2.92
#include <stdio.h>
float_bits float_negate(float_bits f) {
int w = sizeof(float_bits) << 3;
int obj = 1 << (w - 1);
unsigned exp = (f >> 23) & 0xff;
unsigned frac = f & 0x7ffff;
if(!(~exp) && frac)
return f;
else
return f ^ obj;
}
int main() {
return 0;
}
2.93
#include <stdio.h>
float_bits float_absval(float_bits f) {
unsigned exp = f >> 23 & 0xff;
unsigned frac = f & 0x7ffff;
if(!(exp ^ 0xff) && frac)
return f;
else
return exp << 23 | frac;
}
int main() {
return 0;
}
2.94
#include <stdio.h>
float_bits float_twice(float_bits f) {
unsigned exp = (f >> 23) & 0xff;
unsigned frac = f & 0x7ffff;
unsigned sign = (f >> 32) & 1;
if(!(~exp) && frac)
return f;
else if(exp == 0) {
if((f >> 22) & 1) {
exp++;
frac <<= 1;
}
else
frac <<= 1;
}
else {
if((frac >> 22) & 1 == 0)
frac <<= 1;
else if(exp ^ 0xfe)
exp++;
else {
exp = 0xff;
frac = 0;
}
}
return (sign << 31) | (exp << 23) | frac;
}
int main() {
return 0;
}
2.95
#include <stdio.h>
float_bits float_half(float_bits f) {
unsigned sign = (f >> 31) & 1;
unsigned exp = (f >> 23) & 0xff;
unsigned frac = f & 0x7ffff;
if(!(exp ^ 0xff) && frac)
return f;
else if(exp) {
if(exp != 1)
exp--;
else {
if((frac >> 1) & 1) {
frac++;
frac >>= 1;
frac |= 0x400000;
exp--;
}
else {
frac >>= 1;
frac |= 0x400000;
exp--;
}
}
}
else {
if((frac >> 1) & 1) {
frac++;
frac >>= 1;
}
else
frac >>= 1;
}
return (sign << 31) | (exp << 23) | frac;
}
int main() {
return 0;
}
2.96
#include <stdio.h>
int float_f2i(float_bits f) {
unsigned sign = (f >> 31) & 1;
unsigned frac = f & 0x7fffff;
unsigned exp = (f >> 23) & 0xff;
unsigned bias = 0x7f;
int ans = 0;
if(exp >= 0 && exp < bias)
ans = 0;
else if(exp > 0xfd)
ans = 0x80000000;
else {
frac = frac | 0x800000;
if(exp > 23)
frac <<= (exp - bias - 23);
else
frac >>= 23 - (exp - bias);
ans = frac;
}
return sign ? -ans : ans;
}
int main() {
return 0;
}
2.97
#include <stdio.h>
#include <limits.h>
int left_most(unsigned x) {
int w = sizeof(unsigned);
w <<= 3;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x & ((~x >> 1) | INT_MIN);
}
float_bits float_i2f(int i) {
unsigned sign = (i >> 31) & 1;
unsigned e = 0;
unsigned frac = 0;
unsigned bias = (1 << 8) - 1;
if(i == INT_MIN)
return 0xcf000000;
if(sign)
i = -i;
int mask = left_most(i);
int move = 0;
int obj = 0x800000;
if(mask >= obj) {
while(mask != obj) {
mask >>= 1;
move++;
}
if((i & (1 << move) - 1) > (1 << (move - 1))) {
i >>= move;
i++;
}
else if((i & (1 << move) - 1) > (1 << (move - 1))) {
i >>= move;
}
else {
if(i & (1 << move)) {
i >>= move;
i++;
}
else
i >>= move;
}
}
else {
while(mask != obj) {
mask <<= 1;
move--;
}
i <<= -move;
}
frac = i & 0x7fffff;
e = bias + move + 23;
return (sign << 31) | (e << 23) | frac;
}
int main() {
return 0;
}