- 
                Notifications
    
You must be signed in to change notification settings  - Fork 127
 
Bit operation module
        Wang Renxin edited this page May 31, 2022 
        ·
        7 revisions
      
    This page shows how to implement bit operations with MY-BASIC.
Add implementation functions:
static int _bit_and(struct mb_interpreter_t* s, void** l) {
	int result = MB_FUNC_OK;
	int_t m = 0;
	int_t n = 0;
	mb_assert(s && l);
	mb_check(mb_attempt_open_bracket(s, l));
	mb_check(mb_pop_int(s, l, &m));
	mb_check(mb_pop_int(s, l, &n));
	mb_check(mb_attempt_close_bracket(s, l));
	mb_check(mb_push_int(s, l, m & n));
	return result;
}
static int _bit_or(struct mb_interpreter_t* s, void** l) {
	int result = MB_FUNC_OK;
	int_t m = 0;
	int_t n = 0;
	mb_assert(s && l);
	mb_check(mb_attempt_open_bracket(s, l));
	mb_check(mb_pop_int(s, l, &m));
	mb_check(mb_pop_int(s, l, &n));
	mb_check(mb_attempt_close_bracket(s, l));
	mb_check(mb_push_int(s, l, m | n));
	return result;
}
static int _bit_not(struct mb_interpreter_t* s, void** l) {
	int result = MB_FUNC_OK;
	int_t m = 0;
	mb_assert(s && l);
	mb_check(mb_attempt_open_bracket(s, l));
	mb_check(mb_pop_int(s, l, &m));
	mb_check(mb_attempt_close_bracket(s, l));
	mb_check(mb_push_int(s, l, ~m));
	return result;
}
static int _bit_xor(struct mb_interpreter_t* s, void** l) {
	int result = MB_FUNC_OK;
	int_t m = 0;
	int_t n = 0;
	mb_assert(s && l);
	mb_check(mb_attempt_open_bracket(s, l));
	mb_check(mb_pop_int(s, l, &m));
	mb_check(mb_pop_int(s, l, &n));
	mb_check(mb_attempt_close_bracket(s, l));
	mb_check(mb_push_int(s, l, m ^ n));
	return result;
}
static int _bit_lshift(struct mb_interpreter_t* s, void** l) {
	int result = MB_FUNC_OK;
	int_t m = 0;
	int_t n = 0;
	mb_assert(s && l);
	mb_check(mb_attempt_open_bracket(s, l));
	mb_check(mb_pop_int(s, l, &m));
	mb_check(mb_pop_int(s, l, &n));
	mb_check(mb_attempt_close_bracket(s, l));
	mb_check(mb_push_int(s, l, m << n));
	return result;
}
static int _bit_rshift(struct mb_interpreter_t* s, void** l) {
	int result = MB_FUNC_OK;
	int_t m = 0;
	int_t n = 0;
	mb_assert(s && l);
	mb_check(mb_attempt_open_bracket(s, l));
	mb_check(mb_pop_int(s, l, &m));
	mb_check(mb_pop_int(s, l, &n));
	mb_check(mb_attempt_close_bracket(s, l));
	mb_check(mb_push_int(s, l, m >> n));
	return result;
}Register them:
mb_register_func(bas, "BIT_AND", _bit_and);
mb_register_func(bas, "BIT_OR", _bit_or);
mb_register_func(bas, "BIT_NOT", _bit_not);
mb_register_func(bas, "BIT_XOR", _bit_xor);
mb_register_func(bas, "BIT_LSHIFT", _bit_lshift);
mb_register_func(bas, "BIT_RSHIFT", _bit_rshift);Note:
Since MY-BASIC uses signed int for int_t as default, you might need to redefine int_t to support bit operations of unsigned integer, and don't forget to redefine mb_strtol as well.
- Principles
 - Coding
 - Data types
 - Standalone shell
 - Integration
 - Customization
 - More scripting API
 - FAQ