1 (изменено: Arigato, 2020-06-15 23:09:53)

Тема: CMD/BAT: Модуль числа |a| без условных операций

Написал функцию для нахождения модуля числа без использования условных операций. Вот:

@ echo off
setlocal enabledelayedexpansion

set /p a=Enter Integer: 
call :abs %a%
echo abs(%a%) = %errorlevel%

exit /b

:abs
:: Модуль числа
  setlocal
  set /a abs="((%1)>>31)*(%1)+^!((%1)>>31)*(%1)"
endlocal & exit /b %abs%

Вариант без поразрядных операций:

@ echo off
setlocal enabledelayedexpansion

call :abs "%1"
echo abs(%1) = %errorlevel%

exit /b

:abs
:: Модуль числа
  setlocal
  set /a "abs=(%1)"
endlocal & exit /b %abs:-=%

2

Re: CMD/BAT: Модуль числа |a| без условных операций

set /a "x=8 % 3"
( 2 * b ) || ! ( 2 * b )

3

Re: CMD/BAT: Модуль числа |a| без условных операций

Rumata, это что?

4 (изменено: Rumata, 2016-01-15 09:49:52)

Re: CMD/BAT: Модуль числа |a| без условных операций

Ох, простите. Был вечер трудного для. Спутал вычисление модуля числа с делением по модулю.

( 2 * b ) || ! ( 2 * b )

5 (изменено: Arigato, 2016-01-17 13:22:38)

Re: CMD/BAT: Модуль числа |a| без условных операций

Добавил сюда скобочек:

set /a abs="(%1>>31)*%1+^!(%1>>31)*%1"

Теперь можно считать модуль от выражения, например:

call :abs 3-8

Полный код в первом сообщении

6 (изменено: wisgest, 2016-01-20 00:23:38)

Re: CMD/BAT: Модуль числа |a| без условных операций

set /a "abs = (%~1), abs *= (abs >> -1 << 1) + 1"

7

Re: CMD/BAT: Модуль числа |a| без условных операций

set /a "abs=%1^(%1>>32)"

8

Re: CMD/BAT: Модуль числа |a| без условных операций

torus, для отрицательных чисел ответ будет отличаться на 1.

Кроме того, нежелательно вхождение %1 в SET/A без скобок, если допустить, что аргумент может быть не только числом но и выражением;
а т.к. в CMD выражения C-подобны, т.е. в общем случае могут содержать присваивания, то нежелательно не однократное вхождение.

Использованное мной выражение вида

x >> -1

имеет то же предназначение, что и

x >> 32

, т.е. заполнение числа знаковым битом, но не привязано к определённой разрядности. Это пригодно не только для CMD, но и для других языков (JavaScript, AutoHotkey, PHP…).

9 (изменено: Arigato, 2020-06-15 23:09:37)

Re: CMD/BAT: Модуль числа |a| без условных операций

Вариант без поразрядных операций:

@ echo off
setlocal enabledelayedexpansion

call :abs "%1"
echo abs(%1) = %errorlevel%

exit /b

:abs
:: Модуль числа
  setlocal
  set /a "abs=(%1)"
endlocal & exit /b %abs:-=%