Loops/While: Difference between revisions

56,399 bytes added ,  2 months ago
m
added output
(Adding Monte after Modula-3)
m (added output)
 
(247 intermediate revisions by more than 100 users not shown)
Line 1:
{{task|Iteration}}
{{task|Iteration}}Start an integer value at 1024. Loop while it is greater than 0. Print the value (with a newline) and divide it by two each time through the loop.
[[Category:Conditional loops]]
[[Category:Simple]]
{{omit from|GUISS|No loops and we cannot read values}}
 
;Task:
Start an integer value at   '''1024'''.
 
Loop while it is greater than zero.
Print the value (with a newline) and divide it by two each time through the loop.
 
;Related tasks:
*   [[Loop over multiple arrays simultaneously]]
*   [[Loops/Break]]
*   [[Loops/Continue]]
*   [[Loops/Do-while]]
*   [[Loops/Downward for]]
*   [[Loops/For]]
*   [[Loops/For with a specified step]]
*   [[Loops/Foreach]]
*   [[Loops/Increment loop index within loop body]]
*   [[Loops/Infinite]]
*   [[Loops/N plus one half]]
*   [[Loops/Nested]]
*   [[Loops/While]]
*   [[Loops/with multiple ranges]]
*   [[Loops/Wrong ranges]]
<br><br>
 
=={{header|0815}}==
<langsyntaxhighlight lang="0815"><:400:~}:_:%<:a:~$=<:2:=/^:_:</langsyntaxhighlight>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">V n = 1024
L n > 0
print(n)
n I/= 2</syntaxhighlight>
 
=={{header|360 Assembly}}==
;Basic
Using binary arithmetic. Convert results to EBCDIC printable output.
Using binary arithmetic. Convert results to EBCDIC printable output.
<lang 360 Assembly>
WHILE<syntaxhighlight lang="360asm">* CSECT , While This program's control section 27/06/2016
WHILELOO CSECT BAKR 14,0 Callerprogram's registers to linkagecontrol stacksection
LR USING WHILELOO,12,15 set base load entry point address into Reg 12 register
LALR 1312,015 inidicate callerload no saveareabase register
USING WHILE,12LA 6,1024 tell assembler we use Reg 12 as base v=1024
LOOP LTR 6,6 XR 3,3 Register 3while zero.v>0
XRBNP ENDLOOP 4,4 clear even divident reg .
LACVD 56,1024PACKED loadconvert oddv dividentto regpacked decimal
LAOI 9PACKED+7,2X'0F' prepare divisor in reg 9 unpack
LAUNPK 8WTOTXT,WTOLEN PACKED address of WTO areapacked indecimal Regto 8zoned printable
MVCWTO WTOTXT,MF=C'1024'(E,WTOMSG) display v
WTO SRA TEXT=(8)6,1 write to operator initial value 1024 v=v/2 by right shift
B LOOP DS 0H end while
ENDLOOP BR 14 DR 4,9 return to divide r4/5 by r9 caller
PACKED DS PL8 CLR 3,4 packed less than zero? decimal
WTOMSG DS 0F BL RETURN yes,full returnword alignment for wto
WTOLEN DC CVD 5AL2(8),PACKEDH'0' length convertof resultwto tobuffer (packed4+1) decimal
WTOTXT DC CL4' ' OI PACKED+7,X'0F' prepare unpackwto text
XCEND WTOTXT,WTOTXT clear wto text WHILELOO</syntaxhighlight>
{{out}} (+ sign indicates "problem state" (non system key) issued WTO's
UNPK WTOTXT,PACKED packed decimal to zoned (printable)
<pre style="height:16ex">
WTO TEXT=(8) and write-to-operator
B LOOP loop.
RETURN PR , return to caller.
WTOLEN DC H'4' fixed WTO length of four
WTOTXT DS CL4
PACKED DS CL8
END WHILE
</lang>
'''output''' (+ sign indicates "problem state" (non system key) issued WTO's
<pre style="overflow:scroll">
+1024
+0512
Line 49 ⟶ 76:
+0001
</pre>
;Structured Macros
<syntaxhighlight lang="360asm">* While 27/06/2016
WHILELOO CSECT
USING WHILELOO,12 set base register
LR 12,15 load base register
LA 6,1024 v=1024
DO WHILE=(LTR,6,P,6) do while v>0
CVD 6,PACKED convert v to packed decimal
OI PACKED+7,X'0F' prepare unpack
UNPK WTOTXT,PACKED packed decimal to zoned printable
WTO MF=(E,WTOMSG) display
SRA 6,1 v=v/2 by right shift
ENDDO , end while
BR 14 return to caller
PACKED DS PL8 packed decimal
WTOMSG DS 0F full word alignment for wto
WTOLEN DC AL2(8),H'0' length of wto buffer (4+1)
WTOTXT DC CL4' ' wto text
END WHILELOO</syntaxhighlight>
{{out}}
Same as above
 
=={{header|6502 Assembly}}==
Code is called as a subroutine (i.e. JSR LoopsWhile). Specific OS/hardware routines for printing are left unimplemented.
<langsyntaxhighlight lang="6502asm">LoopsWhile: PHA ;push accumulator onto stack
 
LDA #$00 ;the 6502 is an 8-bit processor
Line 68 ⟶ 116:
 
EndLoop: PLA ;restore accumulator from stack
RTS ;return from subroutine</langsyntaxhighlight>
 
=={{header|68000 Assembly}}==
Printing routines are left out since this is not the focus of the task.
<syntaxhighlight lang="68000devpac">main:
MOVE.W #1024,D0
 
WhileLoop:
jsr PrintHexWord
LSR.W #1,D0
BNE WhileLoop</syntaxhighlight>
 
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program loopwhile64.s */
/*******************************************/
/* Constantes file */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessResult: .asciz "@" // message result
szCarriageReturn: .asciz "\n"
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
sZoneConv: .skip 24
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: // entry of program
mov x20,#1024 // loop counter
1: // begin loop
mov x0,x20
ldr x1,qAdrsZoneConv // display value
bl conversion10 // decimal conversion
ldr x0,qAdrszMessResult
ldr x1,qAdrsZoneConv
bl strInsertAtCharInc // insert result at @ character
bl affichageMess // display message
ldr x0,qAdrszCarriageReturn
bl affichageMess // display return line
lsr x20,x20,1 // division by 2
cmp x20,0 // end ?
bgt 1b // no ->begin loop one
100: // standard end of the program
mov x0,0 // return code
mov x8,EXIT // request to exit program
svc 0 // perform the system call
qAdrsZoneConv: .quad sZoneConv
qAdrszMessResult: .quad szMessResult
qAdrszCarriageReturn: .quad szCarriageReturn
 
/********************************************************/
/* File Include fonctions */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
</syntaxhighlight>
{{Output}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
=={{header|Action!}}==
<syntaxhighlight lang="action!">PROC Main()
CARD i=[1024]
 
WHILE i>0
DO
PrintCE(i)
i=i/2
OD
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/While.png Screenshot from Atari 8-bit computer]
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|ActionScript}}==
<langsyntaxhighlight lang="actionscript">var i:int = 1024;
while (i > 0) {
trace(i);
i /= 2;
}</langsyntaxhighlight>
 
=={{header|Ada}}==
<langsyntaxhighlight lang="ada">declare
I : Integer := 1024;
begin
Line 85 ⟶ 242:
I := I / 2;
end loop;
end;</langsyntaxhighlight>
 
=={{header|Agena}}==
Tested with Agena 2.9.5 Win32
<syntaxhighlight lang="agena">scope
local i := 1024;
while i > 0 do
print( i );
i := i \ 2
od
epocs</syntaxhighlight>
 
=={{header|Aime}}==
<langsyntaxhighlight lang="aime">integer i;
 
i = 1024;
Line 94 ⟶ 261:
o_plan(i, "\n");
i /= 2;
}</langsyntaxhighlight>
 
=={{header|ALGOL 60}}==
The Loops/While structure was in the Algol 60 report of January 1963.
<syntaxhighlight lang="algol60">begin
comment Loops/While - algol60 - 21/10/2014;
integer i;
for i:=1024,i div 2 while i>0 do outinteger(1,i)
end
</syntaxhighlight>
{{Out}}
<pre>
1024 512 256 128 64 32 16 8 4 2 1
</pre>
 
=={{header|ALGOL 68}}==
Line 102 ⟶ 282:
 
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d]}}
<langsyntaxhighlight lang="algol68">INT i := 1024;
WHILE i > 0 DO
print(i);
i := i OVER 2
OD</langsyntaxhighlight>
{{Out}}
<pre>
+1024 +512 +256 +128 +64 +32 +16 +8 +4 +2 +1
</pre>
 
=={{header|ALGOL W}}==
<syntaxhighlight lang="algolw">begin
integer i;
i := 1024;
while i > 0 do
begin
write( i );
i := i div 2
end
end.</syntaxhighlight>
 
=={{header|ALGOL-M}}==
<syntaxhighlight lang="algol">begin
integer i;
i := 1024;
while i > 0 do begin
write( i );
i := i / 2;
end;
end</syntaxhighlight>
 
=={{header|Amazing Hopper}}==
<syntaxhighlight lang="c">
#include <jambo.h>
 
Main
i=1024
Loop
Printnl 'i'
i \= 2
Back if 'i' is positive
End
</syntaxhighlight>
<p>Assembler Hopper code:</p>
<syntaxhighlight lang="amazing hopper">
main:
i=1024
____CODE_JUMP____883612951:,
{i};{"\n"}print;
i\=2
{i},jpos(____CODE_JUMP____883612951),____CODE_JUMP____854411479:,
emptystack?do{{0}};return
</syntaxhighlight>
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
Line 116 ⟶ 354:
Both arguments to this message must be blocks (aka anonymous functions or thunks).
 
<langsyntaxhighlight lang="ambienttalk">// print 1024 512 etc
def i := 1024;
while: { i > 0 } do: {
system.print(" "+i);
i := i/2;
}</langsyntaxhighlight>
 
=={{header|AmigaE}}==
<langsyntaxhighlight lang="amigae">PROC main()
DEF i = 1024
WHILE i > 0
Line 130 ⟶ 368:
i := i / 2
ENDWHILE
ENDPROC</langsyntaxhighlight>
 
=={{header|AppleScript}}==
AppleScript does not natively support a standard out. Use the Script Editor's Event Log as the output.
Use the Script Editor's Event Log as the output.
<lang AppleScript >set i to 1024
<syntaxhighlight lang="applescript ">set i to 1024
repeat while i > 0
log i
set i to i / 2
end repeat</langsyntaxhighlight>
 
=={{header|ApplesoftARM BASICAssembly}}==
{{works with|as|Raspberry Pi}}
<lang Applesoft BASIC> 10 I% = 1024
<syntaxhighlight lang="arm assembly">
20 IF I% > 0 THEN PRINT I%:I% = I% / 2: GOTO 20</lang>
/* ARM assembly Raspberry PI */
/* program loopwhile.s */
 
/* Constantes */
.equ STDOUT, 1 @ Linux output console
.equ EXIT, 1 @ Linux syscall
.equ WRITE, 4 @ Linux syscall
 
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessResult: .ascii "" @ message result
sMessValeur: .fill 11, 1, ' '
szCarriageReturn: .asciz "\n"
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: @ entry of program
mov r4,#1024 @ loop counter
1: @ begin loop
mov r0,r4
ldr r1,iAdrsMessValeur @ display value
bl conversion10 @ decimal conversion
ldr r0,iAdrszMessResult
bl affichageMess @ display message
ldr r0,iAdrszCarriageReturn
bl affichageMess @ display return line
lsr r4,#1 @ division by 2
cmp r4,#0 @ end ?
bgt 1b @ no ->begin loop one
 
 
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
svc #0 @ perform the system call
 
iAdrsMessValeur: .int sMessValeur
iAdrszMessResult: .int szMessResult
iAdrszCarriageReturn: .int szCarriageReturn
/******************************************************************/
/* display text with size calculation */
/******************************************************************/
/* r0 contains the address of the message */
affichageMess:
push {r0,r1,r2,r7,lr} @ save registres
mov r2,#0 @ counter length
1: @ loop length calculation
ldrb r1,[r0,r2] @ read octet start position + index
cmp r1,#0 @ if 0 its over
addne r2,r2,#1 @ else add 1 in the length
bne 1b @ and loop
@ so here r2 contains the length of the message
mov r1,r0 @ address message in r1
mov r0,#STDOUT @ code to write to the standard output Linux
mov r7, #WRITE @ code call system "write"
svc #0 @ call systeme
pop {r0,r1,r2,r7,lr} @ restaur registers */
bx lr @ return
/******************************************************************/
/* Converting a register to a decimal */
/******************************************************************/
/* r0 contains value and r1 address area */
.equ LGZONECAL, 10
conversion10:
push {r1-r4,lr} @ save registers
mov r3,r1
mov r2,#LGZONECAL
1: @ start loop
bl divisionpar10 @ r0 <- dividende. quotient ->r0 reste -> r1
add r1,#48 @ digit
strb r1,[r3,r2] @ store digit on area
cmp r0,#0 @ stop if quotient = 0
subne r2,#1 @ previous position
bne 1b @ else loop
@ end replaces digit in front of area
mov r4,#0
2:
ldrb r1,[r3,r2]
strb r1,[r3,r4] @ store in area begin
add r4,#1
add r2,#1 @ previous position
cmp r2,#LGZONECAL @ end
ble 2b @ loop
mov r1,#0 @ final zero
strb r1,[r3,r4]
100:
pop {r1-r4,lr} @ restaur registres
bx lr @return
/***************************************************/
/* division par 10 signé */
/* Thanks to http://thinkingeek.com/arm-assembler-raspberry-pi/*
/* and http://www.hackersdelight.org/ */
/***************************************************/
/* r0 dividende */
/* r0 quotient */
/* r1 remainder */
divisionpar10:
/* r0 contains the argument to be divided by 10 */
push {r2-r4} @ save registers */
mov r4,r0
mov r3,#0x6667 @ r3 <- magic_number lower
movt r3,#0x6666 @ r3 <- magic_number upper
smull r1, r2, r3, r0 @ r1 <- Lower32Bits(r1*r0). r2 <- Upper32Bits(r1*r0)
mov r2, r2, ASR #2 @ r2 <- r2 >> 2
mov r1, r0, LSR #31 @ r1 <- r0 >> 31
add r0, r2, r1 @ r0 <- r2 + r1
add r2,r0,r0, lsl #2 @ r2 <- r0 * 5
sub r1,r4,r2, lsl #1 @ r1 <- r4 - (r2 * 2) = r4 - (r0 * 10)
pop {r2-r4}
bx lr @ return
 
 
</syntaxhighlight>
 
=={{header|ArnoldC}}==
<syntaxhighlight lang="arnoldc">IT'S SHOWTIME
HEY CHRISTMAS TREE n
YOU SET US UP 1024
STICK AROUND n
TALK TO THE HAND n
GET TO THE CHOPPER n
HERE IS MY INVITATION n
HE HAD TO SPLIT 2
ENOUGH TALK
CHILL
YOU HAVE BEEN TERMINATED</syntaxhighlight>
 
=={{header|Arturo}}==
<syntaxhighlight lang="rebol">i: 1024
while [i>0] [
print i
i: i/2
]</syntaxhighlight>
 
{{out}}
 
<pre>1024
512
256
128
64
32
16
8
4
2
1</pre>
 
=={{header|Asymptote}}==
<syntaxhighlight lang="asymptote">int i = 1024;
 
while(i > 0) {
write(i);
i = i # 2; //or also i = quotient(i, 2);
}
 
//# Integer division; equivalent to quotient(x,y).
//Noting that the Python3 community adopted the comment symbol (//) for integer division, the
//Asymptote community decided to reciprocate and use their comment symbol for integer division!</syntaxhighlight>
 
 
=={{header|ATS}}==
With compile-time proof of termination of the loop (which is really a tail recursion).
 
<syntaxhighlight lang="ats">#include "share/atspre_staload.hats"
 
fn
loop_while () : void =
let
fun
loop {n : int | 0 <= n} .<n>.
(n : uint n) : void =
if n <> 0U then
begin
println! (n);
loop (n / 2U)
end
in
loop 1024U
end
 
implement
main0 () =
loop_while ()</syntaxhighlight>
 
{{out}}
<pre>1024
512
256
128
64
32
16
8
4
2
1</pre>
 
It is also possible to write an actual ‘while’ loop, although this method requires a variable (the ‘var’ declaration below) and has other problems, and should be used sparingly.
<syntaxhighlight lang="ats">#include "share/atspre_staload.hats"
 
fn
loop_while () : void =
let
var n : uint = 1024U
in
while (0U < n)
begin
println! (n);
n := n / 2U
end
end
 
implement
main0 () =
loop_while ()</syntaxhighlight>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">i = 1024
While (i > 0)
{
Line 151 ⟶ 615:
i := Floor(i / 2)
}
MsgBox % output</langsyntaxhighlight>
 
=={{header|AWK}}==
<langsyntaxhighlight lang="awk">BEGIN {
v = 1024
while(v > 0) {
Line 160 ⟶ 624:
v = int(v/2)
}
}</langsyntaxhighlight>
 
=={{header|Axe}}==
<syntaxhighlight lang="axe">1024→A
While A>0
Disp A▶Dec,i
A/2→A
End</syntaxhighlight>
 
=={{header|Bait}}==
<syntaxhighlight lang="bait">
fun main() {
mut i := 1024
for i > 0 {
println(i)
i = i / 2
}
}
</syntaxhighlight>
 
=={{header|BASIC}}==
In general, the <code>WHILE</code>-<code>WEND</code> (or <code>DO WHILE</code>-<code>LOOP</code>) statement is used or it is simulated with a construct with conditional jump.
{{works with|QuickBasic|4.5}}
 
<lang qbasic>i = 1024
==={{header|ANSI BASIC}}===
while i > 0
{{works with|Decimal BASIC}}
print i
<syntaxhighlight lang="basic">
100 LET I = 1024
110 DO WHILE I > 0
120 PRINT I
130 LET I = INT(I / 2)
140 LOOP
150 END
</syntaxhighlight>
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
==={{header|Applesoft BASIC}}===
<syntaxhighlight lang="applesoft basic"> 10 I% = 1024
20 IF I% > 0 THEN PRINT I%:I% = I% / 2: GOTO 20</syntaxhighlight>
 
==={{header|ASIC}}===
<syntaxhighlight lang="basic">
REM Loops/While
 
I = 1024
WHILE I > 0
PRINT I
I = I / 2
WEND
 
END
</syntaxhighlight>
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
==={{header|BaCon}}===
<syntaxhighlight lang="freebasic">
i = 1024
WHILE i > 0
PRINT i
i = i / 2
WEND</syntaxhighlight>
wend</lang>
 
==={{header|Ballerina}}===
<syntaxhighlight lang="ballerina">int i = 1024;
while i > 0 {
io:println(i);
i = i / 2;
}
</syntaxhighlight>
 
==={{header|BASIC256}}===
<syntaxhighlight lang="basic256">i = 1024
 
while i > 0
print i
i = i \ 2
end while
 
end</syntaxhighlight>
 
==={{header|BBC BASIC}}===
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> i% = 1024
WHILE i%
PRINT i%
i% DIV= 2
ENDWHILE</langsyntaxhighlight>
 
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
Both loops are equivalent
<syntaxhighlight lang="qbasic">100 i = 1024
110 do while i > 0
120 print i
130 i = int(i/2)
140 loop
150 print
160 i = 1024
170 while i > 0
180 print i
190 i = int(i/2)
200 wend</syntaxhighlight>
 
==={{header|Commodore BASIC}}===
There is no WHILE construct in Commodore BASIC. A GOTO construct is used instead. Also, an integer variable name has a % sign as its suffix.
<syntaxhighlight lang="gwbasic">10 N% = 1024
20 IF N% = 0 THEN 60
30 PRINT N%
40 N% = N%/2
50 GOTO 20
60 END</syntaxhighlight>
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
See also [[#Minimal BASIC|Minimal BASIC]]
 
==={{header|Creative Basic}}===
<syntaxhighlight lang="creative basic">DEF X:INT
 
X=1024
 
OPENCONSOLE
 
WHILE X>0
 
PRINT X
X=X/2
ENDWHILE
'Output starts with 1024 and ends with 1.
 
'Putting the following in the loop will produce output starting with 512 and ending with 0:
'X=X/2
'PRINT X
 
PRINT:PRINT"Press any key to end."
 
'Keep console from closing right away so the figures can be read.
WHILE INKEY$="":ENDWHILE
 
CLOSECONSOLE
 
'Since this is, in fact, a Creative Basic console program.
END</syntaxhighlight>
Note: Spacing is not an issue. I just find the code to be more readable with spaces.
 
==={{header|FreeBASIC}}===
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Dim i As Integer = 1024
 
While i > 0
Print i
i Shr= 1
Wend
 
Sleep</syntaxhighlight>
 
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
==={{header|FutureBasic}}===
<syntaxhighlight lang="futurebasic">window 1
 
long i = 1024
 
while i > 0
print i
i = int( i / 2 )
wend
 
HandleEvents</syntaxhighlight>
Output:
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
==={{header|Gambas}}===
'''[https://gambas-playground.proko.eu/?gist=4e992013e4e7dc69a82477299a5ce23a Click this link to run this code]'''
<syntaxhighlight lang="gambas">Public Sub Main()
Dim siCount As Short = 1024
 
While siCount > 0
Print siCount;;
siCount /= 2
Wend
 
End</syntaxhighlight>
Output:
<pre>
1024 512 256 128 64 32 16 8 4 2 1
</pre>
 
==={{header|GW-BASIC}}===
{{works with|BASICA}}
{{works with|Chipmunk Basic}}
{{works with|PC-BASIC|any}}
{{works with|QBasic}}
<syntaxhighlight lang="qbasic">10 I = 1024
20 WHILE I > 0
30 PRINT I
40 i = INT(i/2)
50 WEND
60 END</syntaxhighlight>
 
==={{header|IS-BASIC}}===
<syntaxhighlight lang="is-basic">100 LET I=1024
110 DO WHILE I>0
120 PRINT I
130 LET I=IP(I/2)
140 LOOP</syntaxhighlight>
 
==={{header|IWBASIC}}===
<syntaxhighlight lang="iwbasic">
DEF X:INT
 
X=1024
 
OPENCONSOLE
 
WHILE X>0
 
PRINT X
X=X/2
 
ENDWHILE
'Output starts with 1024 and ends with 1.
 
'Putting the following in the loop will produce output starting with 512 and ending with 0:
'X=X/2
'PRINT X
 
'When compiled as a console only program, a press any key to continue message is automatic.
'I presume code is added by the compiler.
CLOSECONSOLE
 
'Since this is, in fact, an IWBASIC console program, which compiles and runs.
END</syntaxhighlight>
Note: Spacing is not an issue. I just find the code to be more readable with spaces.
 
==={{header|Liberty BASIC}}===
All integers are changed to floats if an operation creates a non-integer result.
Without using int() the program keeps going until erroring because accuracy was lost.
{{works with|Just BASIC}}
<syntaxhighlight lang="lb">i = 1024
while i > 0
print i
i = int( i / 2)
wend
end</syntaxhighlight>
 
==={{header|Microsoft Small Basic}}===
<syntaxhighlight lang="microsoftsmallbasic">
i = 1024
While i > 0
TextWindow.WriteLine(i)
i = Math.Floor(i / 2)
EndWhile
</syntaxhighlight>
 
==={{header|Minimal BASIC}}===
Minimal BASIC have no <code>while</code> construct. Equivalent using conditional jump:
{{works with|Commodore BASIC}}
{{works with|Nascom ROM BASIC|4.7}}
<syntaxhighlight lang="gwbasic">10 REM Loops/While
20 LET I = 1024
40 IF I <= 0 THEN 80
50 PRINT I
60 LET I = INT(I/2)
70 GOTO 40
80 END</syntaxhighlight>
 
==={{header|MSX Basic}}===
There is no <code>WHILE</code> construct in MSX Basic. A <code>GOTO</code> construct is used instead.
<syntaxhighlight lang="qbasic">10 I% = 1024
20 IF I% = 0 THEN END
30 PRINT I%
40 I% = I%/2 : rem INT(I/2)
50 GOTO 20</syntaxhighlight>
Solutions [[#GW-BASIC|GW-BASIC]] and [[#Minimal _BASIC|Minimal BASIC]] work without changes.
 
==={{header|Nascom BASIC}}===
See [[#Minimal BASIC|Minimal BASIC]].
 
If the repeated sequence is short then the loop can be written in one line.
{{works with|Nascom ROM BASIC|4.7}}
<syntaxhighlight lang="basic">
10 REM Loops/While
20 LET I=1024
30 IF I>0 THEN PRINT I:I=INT(I/2):GOTO 30
40 END
</syntaxhighlight>
 
==={{header|NS-HUBASIC}}===
<syntaxhighlight lang="ns-hubasic">10 I=1024
20 IF I=0 THEN END
30 PRINT I
40 I=I/2
50 GOTO 20</syntaxhighlight>
 
==={{header|PureBasic}}===
<syntaxhighlight lang="purebasic">If OpenConsole()
x.i = 1024
While x > 0
PrintN(Str(x))
x / 2
Wend
 
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit")
Input()
CloseConsole()
EndIf</syntaxhighlight>
 
==={{header|QB64}}===
<syntaxhighlight lang="qb64">Dim n As Integer
n = 1024
While n > 0
Print n
n = n \ 2
Wend</syntaxhighlight>
 
==={{header|QBasic}}===
{{works with|QBasic|1.1}}
Both loops are equivalent
<syntaxhighlight lang="qbasic">i = 1024
WHILE i > 0
PRINT i
i = INT(i / 2)
WEND
PRINT
 
i = 1024
DO WHILE i > 0
PRINT i
i = i \ 2
LOOP
END</syntaxhighlight>
 
==={{header|QuickBASIC}}===
{{works with|QuickBasic|4.5}}
<syntaxhighlight lang="qbasic">i = 1024
WHILE i > 0
PRINT i
i = i \ 2
WEND</syntaxhighlight>
 
==={{header|Run BASIC}}===
<syntaxhighlight lang="runbasic">i = 1024
while i > 0
print i
i = int(i / 2)
wend
end</syntaxhighlight>
 
==={{header|Sinclair ZX81 BASIC}}===
The distinctive thing about a <code>while</code> loop is that the conditional test happens before the loop body, not after—so that the code in the loop may be executed zero times.
 
Since we have no integer type, we floor the result of the division each time.
<syntaxhighlight lang="basic">10 LET I=1024
20 IF I=0 THEN GOTO 60
30 PRINT I
40 LET I=INT (I/2)
50 GOTO 20</syntaxhighlight>
 
==={{header|SmallBASIC}}===
<syntaxhighlight lang="qbasic">
i = 1024
WHILE i > 0
PRINT i
i = i \ 2 ' Using \ for integer division instead of /
WEND</syntaxhighlight>
 
==={{header|TI-83 BASIC}}===
<syntaxhighlight lang="ti83b">1024→I
While I>0
Disp I
I/2→I
End
</syntaxhighlight>
 
==={{header|TI-89 BASIC}}===
<syntaxhighlight lang="ti89b">Local i
1024 → i
While i > 0
Disp i
intDiv(i, 2) → i
EndWhile</syntaxhighlight>
 
==={{Header|Tiny BASIC}}===
Tiny BASIC have no <code>while</code> construct. Equivalent using conditional jump:
{{works with|TinyBasic}}
<syntaxhighlight lang="basic">10 REM Loops/While
20 LET I = 1024
30 IF I <= 0 THEN GOTO 70
40 PRINT I
50 LET I = I / 2
60 GOTO 30
70 END</syntaxhighlight>
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
==={{header|True BASIC}}===
<syntaxhighlight lang="qbasic">LET i = 1024
 
DO WHILE i > 0
PRINT i
LET i = INT(i / 2)
LOOP
END</syntaxhighlight>
 
==={{header|VBA}}===
<syntaxhighlight lang="vb">Public Sub LoopsWhile()
Dim value As Integer
value = 1024
Do While value > 0
Debug.Print value
value = value / 2
Loop
End Sub</syntaxhighlight>
 
==={{header|Visual Basic .NET}}===
<syntaxhighlight lang="vbnet">Dim x = 1024
Do
Console.WriteLine(x)
x = x \ 2
Loop While x > 0</syntaxhighlight>
 
==={{header|Wee Basic}}===
<syntaxhighlight lang="wee basic">let number=1024
while number>0.5
print 1 number
let number=number/2
wend
end</syntaxhighlight>
 
==={{header|XBasic}}===
{{works with|Windows XBasic}}
<syntaxhighlight lang="xbasic">
i% = 1024
DO WHILE i% > 0
PRINT i%
i% = i% / 2
LOOP
</syntaxhighlight>
 
==={{header|Yabasic}}===
<syntaxhighlight lang="yabasic">i = 1024
while i > 0
Print i
i = int(i / 2)
wend
end</syntaxhighlight>
 
=={{header|bc}}==
<langsyntaxhighlight lang="bc">i = 1024
while (i > 0) {
i
i /= 2
}</langsyntaxhighlight>
 
=={{header|Befunge}}==
<langsyntaxhighlight lang="befunge">84*:*> :v
^/2,*25.:_@</langsyntaxhighlight>
 
=={{header|blz}}==
<syntaxhighlight lang="blz">num = 1024
while num > 1 # blz will automatically cast num to a fraction when dividing 1/2, so this is necessary to stop an infinite loop
print(num)
num = num / 2
end</syntaxhighlight>
 
=={{header|BQN}}==
 
BQNcrate's while idiom is the closest equivalent of a while loop in the language.
 
<syntaxhighlight lang="bqn">_while_ ← {𝔽⍟𝔾∘𝔽_𝕣_𝔾∘𝔽⍟𝔾𝕩}
 
(⌊∘÷⟜2 •Show) _while_ (>⟜0) 1024</syntaxhighlight>
 
=={{header|Bracmat}}==
<langsyntaxhighlight lang="bracmat">1024:?n & whl'(!n:>0 & out$!n & div$(!n.2):?n)</langsyntaxhighlight>
 
=={{header|Brat}}==
Converts to integers so output is a little bit shorter and neater.
 
<langsyntaxhighlight lang="brat">i = 1024
while { i > 0 } {
p i
i = (i / 2).to_i
}</langsyntaxhighlight>
 
=={{header|C}}==
<langsyntaxhighlight lang="c">int i = 1024;
while(i > 0) {
printf("%d\n", i);
i /= 2;
}</langsyntaxhighlight>
In for loop fashion:
<langsyntaxhighlight lang="c">int i;
for(i = 1024;i > 0; i/=2){
printf("%d\n", i);
}</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
<syntaxhighlight lang="csharp">int i = 1024;
while(i > 0){
System.Console.WriteLine(i);
i /= 2;
}</syntaxhighlight>
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">int i = 1024;
while(i > 0) {
std::cout << i << std::endl;
i /= 2;
}</langsyntaxhighlight>
Alternatively, it can be done with <code>for</code>:
<langsyntaxhighlight lang="cpp">for (int i = 1024; i > 0; i /= 2)
std::cout << i << std::endl;</langsyntaxhighlight>
 
Instead of <code>i /= 2</code> one can also use the bit shift operator <code>i >>= 1</code> on integer variables.
 
Indeed, in C++,
<syntaxhighlight lang ="cpp">for (init; cond; update){
statement;</lang>
}</syntaxhighlight>
is equivalent to
<langsyntaxhighlight lang="cpp">{
init;
while (cond){
{
statement;
update;
}
}</langsyntaxhighlight>
 
=={{header|CCaché sharp|C#ObjectScript}}==
<syntaxhighlight lang="caché objectscript">WHILELOOP
<lang csharp>int i = 1024;
set x = 1024
while(i > 0){
while (x > 0) {
System.Console.WriteLine(i);
i /= 2; write x,!
set x = (x \ 2) ; using non-integer division will never get to 0
}</lang>
}
quit</syntaxhighlight>
 
{{out}}<pre>SAMPLES>DO ^WHILELOOP
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|Chapel}}==
<langsyntaxhighlight lang="chapel">var val = 1024;
while val > 0 {
writeln(val);
val /= 2;
}</langsyntaxhighlight>
 
=={{header|ChucK}}==
<syntaxhighlight lang="text">
1024 => int value;
 
while(value > 0)
{
<<<value>>>;
value / 2 => value;
}
</syntaxhighlight>
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="lisp">(def i (ref 1024))
 
(while (> @i 0)
(println @i)
(dosync (ref-set i (quot @i 2))))</langsyntaxhighlight>
 
2 ways without mutability:
 
<langsyntaxhighlight Clojurelang="clojure">(loop [i 1024]
(when (pos? i)
(println i)
Line 265 ⟶ 1,289:
 
(doseq [i (take-while pos? (iterate #(quot % 2) 1024))]
(println i))</langsyntaxhighlight>
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">start_up = proc ()
po: stream := stream$primary_output()
n: int := 1024
while n>0 do
stream$putl(po, int$unparse(n))
n := n/2
end
end start_up</syntaxhighlight>
 
=={{header|COBOL}}==
COBOL does not have a while loop construct, but it is does have a <code>PERFORM UNTIL</code> structure, which means that the normal condition used in a while loop must be negated.
<langsyntaxhighlight lang="cobol"> IDENTIFICATION DIVISION.
PROGRAM-ID. Loop-While.
 
Line 283 ⟶ 1,317:
 
GOBACK
.</langsyntaxhighlight>
 
=={{header|ColdFusion}}==
Line 289 ⟶ 1,323:
 
With tags:
<langsyntaxhighlight lang="cfm"><cfset i = 1024 /><cfloop condition="i GT 0"> #i#< br />
<cfset i /= 2 />
</cfloop></langsyntaxhighlight>
With script:
<langsyntaxhighlight lang="cfm"><cfscript> i = 1024;
while( i > 0 )
{
writeOutput( i + "< br/ >" );
}
</cfscript></langsyntaxhighlight>
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(setqlet ((i 1024))
(loop while (>plusp i 0) do
(print i)
(setqsetf i (floor i 2)))</lang>)
 
(loop with i = 1024
while (plusp i) do
(print i)
(setf i (floor i 2)))
 
(defparameter *i* 1024)
(loop while (plusp *i*) do
(print *i*)
(setf *i* (floor *i* 2)))
</syntaxhighlight>
 
=={{header|Cowgol}}==
<syntaxhighlight lang="cowgol">include "cowgol.coh";
 
var n: uint16 := 1024;
while n > 0 loop
print_i16(n);
print_nl();
n := n/2;
end loop;</syntaxhighlight>
 
=={{header|Crack}}==
<langsyntaxhighlight lang="crack">i = 1024;
while( i > 0 ) {
cout ` $i\n`;
i = i/2;
}</langsyntaxhighlight>
=={{header|Creative Basic}}==
<lang Creative Basic>DEF X:INT
 
=={{header|Crystal}}==
X=1024
<syntaxhighlight lang="crystal">i = 1024
while i > 0
puts i
i //= 2
end</syntaxhighlight>
 
<code>until ''condition''</code> is the negated version, equivalent to <code>while !(''condition'')</code>.
OPENCONSOLE
 
<syntaxhighlight lang="crystal">i = 1024
WHILE X>0
until i <= 0
 
PRINTputs Xi
X=Xi //= 2
end</syntaxhighlight>
ENDWHILE
'Output starts with 1024 and ends with 1.
 
'Putting the following in the loop will produce output starting with 512 and ending with 0:
'X=X/2
'PRINT X
 
PRINT:PRINT"Press any key to end."
 
'Keep console from closing right away so the figures can be read.
WHILE INKEY$="":ENDWHILE
 
CLOSECONSOLE
 
'Since this is, in fact, a Creative Basic console program.
END</lang>
Note: Spacing is not an issue. I just find the code to be more readable with spaces.
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio;
 
void main() {
Line 352 ⟶ 1,393:
i >>= 1;
}
}</langsyntaxhighlight>
{{out}}
<pre>1024
Line 365 ⟶ 1,406:
2
1</pre>
 
=={{header|Dao}}==
<syntaxhighlight lang="dao">i = 1024;
while( i > 0 ) i = i / 2;</syntaxhighlight>
 
=={{header|Dart}}==
<syntaxhighlight lang="dart">void main() {
var val = 1024;
while (val > 0) {
print(val);
val >>= 2;
}
}</syntaxhighlight>
 
Instead of the bitshift operator i >>= 2, you can also use i /= 2 on double variables.
<syntaxhighlight lang="dart">void main() {
num val = 1024;
while (val > 0) {
print(val);
val /= 2;
}
}</syntaxhighlight>
 
=={{header|Dc}}==
<syntaxhighlight lang="dc">[ q ] sQ [ d 0!<Q p 2 / lW x ] sW 1024 lW x</syntaxhighlight>
People may think all loops in Dc looks alike. In fact, there aren't loop, but conditional execution in Dc. You expand and execute the content of a register (in here, p) whenever the condition is satisfied.
<lang Dc>1024[p2/d0<p]dspx</lang>
 
=={{header|DaoDCL}}==
 
<lang dao>i = 1024;
DCL is quite primitive in terms of "control statements", no WHILE, REPEAT, UNLESS or FOR,
while( i > 0 ) i = i / 2;</lang>
so must make do with IF/THEN/ELSE and GOTO statements.
 
<syntaxhighlight lang="dcl">$ i = 1024
$Loop:
$ IF ( i .LE. 0 ) THEN GOTO LoopEnd
$ WRITE sys$output F$FAO( " i = !4UL", i ) ! formatted ASCII output, fixed-width field
$ ! Output alternatives:
$ ! WRITE sys$output F$STRING( i ) ! explicit integer-to-string conversion
$ ! WRITE sys$output i ! implicit conversion to string/output
$ i = i / 2
$ GOTO Loop
$LoopEnd:</syntaxhighlight>
 
=={{header|Delphi}}==
 
<syntaxhighlight lang="delphi">var
<lang Delphi>var
i : Integer;
begin
Line 386 ⟶ 1,460:
i := i div 2;
end;
end;</langsyntaxhighlight>
 
=={{header|Draco}}==
<syntaxhighlight lang="draco">proc nonrec main() void:
word i;
i := 1024;
while i > 0 do
writeln(i);
i := i >> 1
od
corp</syntaxhighlight>
{{out}}
<pre>1024
512
256
128
64
32
16
8
4
2
1</pre>
 
=={{header|Dragon}}==
<syntaxhighlight lang="dragon">i = 1024
while(i > 0){
showln i
i >>= 1 //also acceptable: i /= 2
}</syntaxhighlight>
 
=={{header|DUP}}==
 
<syntaxhighlight lang="dup">1024[$][$.10,2/\%]# {Short form}</syntaxhighlight>
 
Explanation:
<syntaxhighlight lang="dup">1024 {push 1024 on stack}
[ ][ ]# {while[condition>0][do]}
$ {DUP}
$. {DUP, print top of stack to STDOUT}
10, {print newline}
2/\% {2 DIV/MOD SWAP POP}</syntaxhighlight>
 
Alternative, if the interpreter allows using the shift operator:
 
<syntaxhighlight lang="dup">1024[$][$.10,1»]#</syntaxhighlight>
 
Output:
 
<syntaxhighlight lang="dup">1024
512
256
128
64
32
16
8
4
2
1</syntaxhighlight>
 
=={{header|DWScript}}==
 
<langsyntaxhighlight Delphilang="delphi">var i := 1024;
 
while i > 0 do begin
PrintLn(i);
i := i div 2;
end;</langsyntaxhighlight>
 
=={{header|Dyalect}}==
 
{{trans|Swift}}
 
<syntaxhighlight lang="dyalect">var i = 1024
while i > 0 {
print(i)
i /= 2
}</syntaxhighlight>
 
=={{header|E}}==
 
<langsyntaxhighlight lang="e">var i := 1024
while (i > 0) {
println(i)
i //= 2
}</langsyntaxhighlight>
 
=={{header|EasyLang}}==
 
<syntaxhighlight lang="text">i = 1024
while i > 0
print i
i = i div 2
.</syntaxhighlight>
 
=={{header|EchoLisp}}==
<syntaxhighlight lang="lisp">
(set! n 1024)
(while (> n 0) (write n) (set! n (quotient n 2)))
1024 512 256 128 64 32 16 8 4 2 1
</syntaxhighlight>
 
=={{header|EGL}}==
 
<langsyntaxhighlight EGLlang="egl">x int = 1024;
while ( x > 0 )
SysLib.writeStdout( x );
x = MathLib.floor( x / 2 );
end</langsyntaxhighlight>
 
=={{header|Elena}}==
ELENA 6.x:
<syntaxhighlight lang="elena">public program()
{
int i := 1024;
while (i > 0)
{
console.writeLine(i);
i /= 2
}
}</syntaxhighlight>
 
=={{header|Elixir}}==
<syntaxhighlight lang="elixir">defmodule Loops do
def while(0), do: :ok
def while(n) do
IO.puts n
while( div(n,2) )
end
end
 
Loops.while(1024)</syntaxhighlight>
 
=={{header|Emacs Lisp}}==
<syntaxhighlight lang="lisp">(let ((i 1024))
(while (> i 0)
(message "%d" i)
(setq i (/ i 2))))</syntaxhighlight>
 
=={{header|EMal}}==
<syntaxhighlight lang="emal">
int i = 1024
while i > 0
writeLine(i)
i /= 2
end
</syntaxhighlight>
 
=={{header|Erlang}}==
<langsyntaxhighlight lang="erlang">-module(while).
-export([loop/0]).
 
Line 425 ⟶ 1,622:
loop(N) when N >0 ->
io:format("~w~n", [N]),
loop(N div 2).</langsyntaxhighlight>
 
=={{header|ERRE}}==
<syntaxhighlight lang="erre">
I%=1024
WHILE I%>0 DO ! you can leave out >0
PRINT(I%)
I%=I% DIV 2 ! I%=INT(I%/2) for C-64 version
END WHILE
</syntaxhighlight>
 
=={{header|Euphoria}}==
<langsyntaxhighlight Euphorialang="euphoria">integer i
i = 1024
 
Line 434 ⟶ 1,640:
printf(1, "%g\n", {i})
i = floor(i/2) --Euphoria does NOT use integer division. 1/2 = 0.5
end while</langsyntaxhighlight>
Even without the <code>floor()</code> the code will in fact end. But it's FAR beyond 1.
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">let rec loop n = if n > 0 then printf "%d " n; loop (n / 2)
loop 1024</langsyntaxhighlight>
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">1024 [ dup 0 > ] [ dup . 2 /i ] while drop</langsyntaxhighlight>
 
=={{header|FALSE}}==
<langsyntaxhighlight lang="false">1024[$0>][$."
"2/]#%</langsyntaxhighlight>
 
=={{header|Fantom}}==
 
<langsyntaxhighlight lang="fantom">class Main
{
public static Void main ()
Line 461 ⟶ 1,667:
}
}
}</langsyntaxhighlight>
 
=={{header|Fennel}}==
<syntaxhighlight lang="fennel">(var n 1024)
(while (> i 0)
(print i)
(set i (// n 2)))</syntaxhighlight>
=={{header|Fermat}}==
Note that the test is against something between 1/2 and 1, rather than 0. Otherwise Fermat will continue printing numbers of the form 1/2^n indefinitely.
<syntaxhighlight lang="fermat">n:=1024;
while n>2/3 do !!n;n:=n/2; od;</syntaxhighlight>
 
=={{header|Forth}}==
<langsyntaxhighlight lang="forth">: halving ( n -- )
begin dup 0 >
while cr dup . 2/
repeat drop ;
1024 halving</langsyntaxhighlight>
 
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<langsyntaxhighlight lang="fortran">INTEGER :: i = 1024
DO WHILE (i > 0)
WRITE(*,*) i
i = i / 2
END DO</langsyntaxhighlight>
 
{{works with|Fortran|77 and later}}
<langsyntaxhighlight lang="fortran"> PROGRAM LOOPWHILE
INTEGER I
 
Line 494 ⟶ 1,710:
GOTO 10
ENDIF
STOP
END</syntaxhighlight>
 
{{works with|Fortran|IV and 66 and later}}
C This is an alternative while loop with labels on both ends. This
<syntaxhighlight lang="fortran"> PROGRAM LOOPWHILE
C will use the condition as a break rather than create an entire
INTEGER I
C IF block. Which you use is up to you, but be aware that you must
C FORTRAN 66 does not have IF block.
C use this one if you plan on allowing for breaks.
I = 1024
20 10 CONTINUE
C IF (I .LE. If0) conditionGOTO is false, break.20
IFWRITE (I .LE. 0*,*) GOTO 30I
C I = I Handle/ I.2
GOTO WRITE (*,*) I10
20 CONTINUE
I = I / 2
STOP
C Jump back to the "loop" beginning.
GOTO 20END</syntaxhighlight>
30 CONTINUE
 
=={{header|Fortress}}==
STOP
<syntaxhighlight lang="fortress">
END</lang>
component loops_while
export Executable
 
var i:ZZ32 = 1024
run() = while i > 0 do
println(i)
i := i DIV 2
end
end
</syntaxhighlight>
 
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|Frink}}==
<langsyntaxhighlight lang="frink">i=1024
while i>0
{
i = i/1
}</langsyntaxhighlight>
 
=={{header|GAP}}==
<langsyntaxhighlight lang="gap">n := 1024;
while n > 0 do
Print(n, "\n");
n := QuoInt(n, 2);
od;</langsyntaxhighlight>
 
=={{header|GML}}==
<langsyntaxhighlight GMLlang="gml">i = 1024
while(i > 0)
{
show_message(string(i))
i /= 2
}</langsyntaxhighlight>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">i := 1024
for i > 0 {
fmt.Printf("%d\n", i)
i /= 2
}</langsyntaxhighlight>
 
=={{header|Groovy}}==
Solution:
<langsyntaxhighlight lang="groovy">int i = 1024
while (i > 0) {
println i
i /= 2
}</langsyntaxhighlight>
 
{{Out}}
Line 564 ⟶ 1,806:
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">import Control.Monad (when)
 
main = loop 1024
where loop n = when (n > 0)
(do print n
loop (n `div` 2))</langsyntaxhighlight>
 
You couldcan tryuse towhileM_ writefunction afrom "while"monad-loops package that operates on monads:
 
<syntaxhighlight lang ="haskell">import ControlData.Monad (when)IORef
import Control.Monad.Loops
 
whileM :: (Monad m) => m Bool -> m a -> m ()
whileM cond body = do c <- cond
when c (body >> whileM cond body)</lang>
 
You can use it like this
 
<lang haskell>import Data.IORef
 
main :: IO ()
main = do r <- newIORef 1024
whileMwhileM_ (do n <- readIORef r
return (n > 0))
(do n <- readIORef r
print n
modifyIORef r (`div` 2))</langsyntaxhighlight>
 
With MonadComprehensions extension you can write it a little bit more readable:
<syntaxhighlight lang="haskell">{-# LANGUAGE MonadComprehensions #-}
import Data.IORef
import Control.Monad.Loops
 
main :: IO ()
main = do
r <- newIORef 1024
whileM_ [n > 0 | n <- readIORef r] $ do
n <- readIORef r
print n
modifyIORef r (`div` 2)</syntaxhighlight>
 
=={{header|Haxe}}==
Using shift right.
<syntaxhighlight lang="haxe">var i = 1024;
while (i > 0) {
Sys.println(i);
i >>= 1;
}</syntaxhighlight>
 
Using integer division.
<syntaxhighlight lang="haxe">var i = 1024;
while (i > 0) {
Sys.println(i);
i = Std.int(i / 2);
}</syntaxhighlight>
 
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|hexiscript}}==
<syntaxhighlight lang="hexiscript">let i 1024
while i > 0
println i
let i (i / 2)
endwhile</syntaxhighlight>
 
=={{header|HolyC}}==
<syntaxhighlight lang="holyc">U16 i = 1024;
while (i > 0) {
Print("%d\n", i);
i /= 2;
}</syntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight lang="icon">procedure main()
local i
i := 1024
while write(0 < (i := i / 2))
end</langsyntaxhighlight>
 
=={{header|Inform 7}}==
<langsyntaxhighlight lang="inform7">let N be 1024;
while N > 0:
say "[N][line break]";
let N be N / 2;</langsyntaxhighlight>
=={{header|IWBASIC}}==
<lang IWBASIC>
DEF X:INT
 
=={{Header|Insitux}}==
X=1024
 
Use <code>/</code> for floating-point division, and use <code>(> i 0)</code> for full printing of the sequence (as the output of <code>1</code> here is due to the return of the last <code>while</code> statement).
OPENCONSOLE
 
<syntaxhighlight lang="insitux">
WHILE X>0
(var i 1024)
 
(while (> i 1)
PRINT X
(print i)
X=X/2
(var i (// i 2)))
</syntaxhighlight>
 
{{out}}
ENDWHILE
'Output starts with 1024 and ends with 1.
 
<pre>
'Putting the following in the loop will produce output starting with 512 and ending with 0:
1024
'X=X/2
512
'PRINT X
256
 
128
'When compiled as a console only program, a press any key to continue message is automatic.
64
'I presume code is added by the compiler.
32
CLOSECONSOLE
16
 
8
'Since this is, in fact, an IWBASIC console program, which compiles and runs.
4
END</lang>
2
Note: Spacing is not an issue. I just find the code to be more readable with spaces.
1
</pre>
 
=={{header|J}}==
J is array-oriented, so there is very little need for loops. For example, one could satisfy this task this way:
 
<langsyntaxhighlight lang="j">,. <.@-:^:*^:a: 1024</langsyntaxhighlight>
 
J does support loops for those times they can't be avoided (just like many languages support gotos for those time they can't be avoided).
 
<langsyntaxhighlight lang="j">monad define 1024
while. 0 < y do.
smoutput y
Line 643 ⟶ 1,939:
end.
i.0 0
)</langsyntaxhighlight>
 
Note: this defines an anonymous function (monad define, and the subsequent lines) and passes it the argument 1024, which means it will be executed as soon as the full definition is available.
 
=={{header|Java}}==
<langsyntaxhighlight lang="java5">int i = 1024;
while(i > 0){
System.out.println(i);
i >>= 1; //also acceptable: i /= 2;
}</langsyntaxhighlight>
With a for loop:
<langsyntaxhighlight lang="java5">for(int i = 1024; i > 0;i /= 2 /*or i>>= 1*/){
System.out.println(i);
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
<langsyntaxhighlight lang="javascript">var n = 1024;
while (n > 0) {
print(n);
n /= 2;
}</langsyntaxhighlight>
 
In a functional idiom of JavaScript, however, we can not use a While '''statement''' to achieve this task, as statements return no value, mutate state, and can not be composed within other functional expressions.
 
Instead, we can define a composable loopWhile() '''function''' which has no side effects, and takes 3 arguments:
:#An initial value
:#A function which returns some derived value, corresponding to the body of the While loop
:#A conditional function, corresponding to the While test
 
<syntaxhighlight lang="javascript">function loopWhile(varValue, fnDelta, fnTest) {
'use strict';
var d = fnDelta(varValue);
 
return fnTest(d) ? [d].concat(
loopWhile(d, fnDelta, fnTest)
) : [];
}
 
console.log(
loopWhile(
1024,
function (x) {
return Math.floor(x/2);
},
function (x) {
return x > 0;
}
).join('\n')
);</syntaxhighlight>
 
If we assume integer division here (Math.floor(x/2)) rather than the floating point division (x/2) used in the imperative example, we obtain the output:
 
<syntaxhighlight lang="javascript">512
256
128
64
32
16
8
4
2
1</syntaxhighlight>
 
=={{header|Joy}}==
<langsyntaxhighlight lang="joy">DEFINE putln == put '\n putch.
1024 [] [dup putln 2 /] while.</syntaxhighlight>
 
=={{header|jq}}==
1024 [] [dup putln 2 /] while.</lang>
'''Using recurse/1'''<syntaxhighlight lang="jq"># To avoid printing 0, test if the input is greater than 1
1024 | recurse( if . > 1 then ./2 | floor else empty end)</syntaxhighlight>
'''Using recurse/2''' (requires jq >1.4)
<syntaxhighlight lang="jq">1024 | recurse( ./2 | floor; . > 0)</syntaxhighlight>
'''Using a filter'''
<syntaxhighlight lang="jq">def task: if . > 0 then ., (./2 | floor | task) else empty end;
1024|task</syntaxhighlight>
'''Using while/2'''
 
If your jq does not include while/2 as a builtin, here is its definition:
<syntaxhighlight lang="jq">def while(cond; update):
def _while: if cond then ., (update | _while) else empty end;
_while;</syntaxhighlight>
For example:
<syntaxhighlight lang="jq">1024|while(. > 0; ./2|floor)</syntaxhighlight>
 
=={{header|Jsish}}==
<syntaxhighlight lang="javascript">#!/usr/bin/env jsish
/* Loops/While in Jsish */
var i = 1024;
 
while (i > 0) { puts(i); i = i / 2 | 0; }
 
/*
=!EXPECTSTART!=
1024
512
256
128
64
32
16
8
4
2
1
=!EXPECTEND!=
*/</syntaxhighlight>
 
{{out}}
<pre>prompt$ jsish -u loopsWhile.jsi
[PASS] loopsWhile.jsi</pre>
 
=={{header|Julia}}==
<syntaxhighlight lang="julia">
n = 1024
 
while n > 0
println(n)
n >>= 1
end
</syntaxhighlight>
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|K}}==
Implementation of the task using anonymous function is
given below
<syntaxhighlight lang="k">
{while[x>0; \echo x; x%:2]} 1024
</syntaxhighlight>
 
=={{header|Kotlin}}==
<syntaxhighlight lang="scala">// version 1.0.6
 
fun main(args: Array<String>) {
var value = 1024
while (value > 0) {
println(value)
value /= 2
}
}</syntaxhighlight>
 
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|LabVIEW}}==
Use Round Towards -Inf to prevent the integer becoming a float.<br/>{{VI snippet}}<br/>
[[File:LabVIEW_Loops_While.png]]
 
=={{header|Lambdatalk}}==
<syntaxhighlight lang="scheme">
{def loops_while
{lambda {:i}
{if {< :i 1}
then (end of loop)
else :i {loops_while {/ :i 2}}}}}
-> loops_while
 
{loops_while 1024}
-> 1024 512 256 128 64 32 16 8 4 2 1 (end of loop)
</syntaxhighlight>
 
Alternative solution:
<syntaxhighlight lang="scheme">
{def while
{lambda {:i}
{if {< :i 1}
then
else {br}:i {while {/ :i 2}}}}}
 
{while 1024} ->
 
1024
512
256
128
64
32
16
8
4
2
1
</syntaxhighlight>
 
=={{header|Lang}}==
<syntaxhighlight lang="lang">
$n = 1024
while($n > 0) {
fn.println($n)
$n //= 2
}
</syntaxhighlight>
 
=={{header|Lang5}}==
{{trans|Factor}}
<langsyntaxhighlight lang="lang5">: /i / int ; : 0= 0 == ;
: dip swap '_ set execute _ ; : dupd 'dup dip ;
: 2dip swap '_x set swap '_y set execute _y _x ;
Line 684 ⟶ 2,167:
loop ;
 
1024 "dup 0 >" "dup . 2 /i" while</langsyntaxhighlight>
 
 
=={{header|langur}}==
<syntaxhighlight lang="langur">var .i = 1024
while .i > 0 {
writeln .i
.i \= 2
}</syntaxhighlight>
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">local(i = 1024)
while(#i > 0) => {^
#i + '\r'
#i /= 2
^}</langsyntaxhighlight>
 
=={{header|Liberty BASICLDPL}}==
<syntaxhighlight lang="ldpl">data:
All integers are changed to floats if an operation creates a non-integer result.
n is number
Without using int() the program keeps going until erroring because accuracy was lost.
 
<lang lb>i = 1024
procedure:
while i > 0
store 1024 in n
print i
while n is greater than 0 do
i = int( i / 2)
display n lf
wend
divide n by 2 in n
end</lang>
floor n
repeat</syntaxhighlight>
 
=={{header|LIL}}==
<syntaxhighlight lang="tcl">set num 1024; while {$num > 0} {print $num; set num [expr $num \ 2]}</syntaxhighlight>
 
Backslash is integer division, otherwise LIL would allow the division to go floating point.
 
=={{header|Lingo}}==
<syntaxhighlight lang="lingo">n = 1024
repeat while n>0
put n
n = n/2 -- integer division implicitely returns floor: 1/2 -> 0
end repeat</syntaxhighlight>
 
=={{header|Lisaac}}==
<langsyntaxhighlight Lisaaclang="lisaac">+ i : INTEGER;
i := 1024;
{ i > 0 }.while_do {
Line 712 ⟶ 2,214:
i := i / 2;
};</langsyntaxhighlight>
 
=={{header|LiveCode}}==
<syntaxhighlight lang="livecode">put 1024 into n
repeat while n > 0
put n & cr
divide n by 2
end repeat</syntaxhighlight>
 
=={{header|Logo}}==
<langsyntaxhighlight lang="logo">make "n 1024
while [:n > 0] [print :n make "n :n / 2]</langsyntaxhighlight>
 
=={{header|LOLCODE}}==
Line 722 ⟶ 2,231:
LOLCODE's loop semantics require an afterthought if a condition is used, thus the <tt>nop</tt> in the following example. The more idiomatic approach would have been to <tt>GTFO</tt> of the loop once <tt>n</tt> had reached 0.
 
<langsyntaxhighlight LOLCODElang="lolcode">HAI 1.3
 
I HAS A n ITZ 1024
Line 731 ⟶ 2,240:
IM OUTTA YR loop
 
KTHXBYE</langsyntaxhighlight>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">n = 1024
while n>0 do
print(n)
n = math.floor(n/2)
end</langsyntaxhighlight>
 
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
Module Checkit {
Def long A=1024
While A>0 {
Print A
A/=2
}
}
Checkit
</syntaxhighlight>
One line
<syntaxhighlight lang="m2000 interpreter">
Module Online { A=1024&: While A>0 {Print A: A/=2}} : OnLine
</syntaxhighlight>
 
=={{header|m4}}==
This ‘loop’ is really a tail recursion, which m4 implementations generally do ''not'' optimize.
<syntaxhighlight lang="m4">divert(-1)
 
define(`loop',
`ifelse(eval(0 < ($1)),1,`$1`
'loop(eval(($1) / 2))')')
 
divert`'dnl
loop(1024)dnl</syntaxhighlight>
{{out}}
$ m4 loops_while.m4
<pre>1024
512
256
128
64
32
16
8
4
2
1</pre>
 
=={{header|Make}}==
<syntaxhighlight lang="make">NEXT=`expr $* / 2`
MAX=10
 
all: $(MAX)-n;
 
0-n:;
 
%-n: %-echo
@-make -f while.mk $(NEXT)-n MAX=$(MAX)
 
%-echo:
@echo $*</syntaxhighlight>
 
Invoking it
<syntaxhighlight lang="make">|make -f while.mk MAX=1024</syntaxhighlight>
 
=={{header|Maple}}==
To avoid generating an infinite sequence (1/2, 1/4, 1/8, 1/16, etc.) of fractions after n takes the value 1, we use integer division (iquo) rather than the solidus operation (/).
<langsyntaxhighlight Maplelang="maple">> n := 1024: while n > 0 do print(n); n := iquo(n,2) end:
1024
512
Line 753 ⟶ 2,319:
4
2
1</langsyntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
Mathematica does not support integer-rounding, it would result in getting fractions: 1/2, 1/4 , 1/8 and so on; the loop would take infinite time without using the Floor function:
<langsyntaxhighlight Mathematicalang="mathematica">i = 1024;
While[i > 0,
Print[i];
i = Floor[i/2];
]</langsyntaxhighlight>
 
=={{header|MATLAB}} / {{header|Octave}}==
In Matlab (like Octave) the math is done floating point, then rounding to integer, so that 1/2 will be always 1 and never 0. A 'floor' is used to round the number.
<langsyntaxhighlight Matlablang="matlab">i = 1024;
while (i > 0)
disp(i);
i = floor(i/2);
end</langsyntaxhighlight>
 
A vectorized version of the code is
 
<langsyntaxhighlight Matlablang="matlab"> printf('%d\n', 2.^[log2(1024):-1:0]);</langsyntaxhighlight>
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">block([n], n: 1024, while n > 0 do (print(n), n: quotient(n, 2)));
 
/* using a C-like loop: divide control variable by two instead of incrementing it */
for n: 1024 next quotient(n, 2) while n > 0 do print(n);</langsyntaxhighlight>
 
=={{header|MAXScript}}==
<langsyntaxhighlight lang="maxscript">a = 1024
while a > 0 do
(
print a
a /= 2
)</langsyntaxhighlight>
 
=={{header|Make}}==
<lang make>NEXT=`expr $* / 2`
MAX=10
 
all: $(MAX)-n;
 
0-n:;
 
%-n: %-echo
@-make -f while.mk $(NEXT)-n MAX=$(MAX)
 
%-echo:
@echo $*</lang>
 
Invoking it
<lang make>|make -f while.mk MAX=1024</lang>
 
=={{header|Metafont}}==
Line 810 ⟶ 2,359:
Metafont has no <tt>while</tt> loop, but it can be "simulated" easily.
 
<langsyntaxhighlight lang="metafont">a := 1024;
forever: exitif not (a > 0);
show a;
a := a div 2;
endfor</langsyntaxhighlight>
 
=={{header|min}}==
{{works with|min|0.19.3}}
<syntaxhighlight lang="min">1024 :n (n 0 >) (n puts 2 div @n) while</syntaxhighlight>
 
=={{header|MiniScript}}==
<syntaxhighlight lang="miniscript">i = 1024
while i > 0
print i
i = floor(i/2)
end while</syntaxhighlight>
 
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|MIRC Scripting Language}}==
 
<langsyntaxhighlight lang="mirc">alias while_loop {
var %n = 10
while (%n >= 0) {
Line 824 ⟶ 2,399:
dec %n
}
}</langsyntaxhighlight>
 
=={{header|MIXAL}}==
<syntaxhighlight lang="mixal">
******************************************
* X = M / N WHILE X > 0
* STORE EACH X IN NUMERIC ARRAY
* PRINT ARRAY
*******************************************
M EQU 1024
N EQU 2
LPR EQU 18
BUF0 EQU 100
MSG EQU 2000
LENGTH EQU 500
ORIG 3000
START IOC 0(LPR)
ENTX M
CALC STX BUF0,1
DIV =N=
SRAX 5
INC1 1
JXP CALC
ST1 LENGTH
PRINT LDA BUF0,2
CHAR
STX MSG
OUT MSG(LPR)
INC2 1
CMP2 LENGTH
JNE PRINT
HLT
END START
</syntaxhighlight>
 
=={{header|МК-61/52}}==
<syntaxhighlight lang="text">1 0 2 4 П0 ИП0 /-/ x<0 15 ИП0
2 / П0 БП 05 С/П</langsyntaxhighlight>
 
=={{header|Modula-2}}==
<langsyntaxhighlight lang="modula2">MODULE DivBy2;
IMPORT InOut;
 
Line 843 ⟶ 2,451:
i := i DIV 2
END
END DivBy2.</langsyntaxhighlight>
 
=={{header|Modula-3}}==
The usual module code and imports are omitted.
<langsyntaxhighlight lang="modula3">PROCEDURE DivBy2() =
VAR i: INTEGER := 1024;
BEGIN
Line 855 ⟶ 2,463:
i := i DIV 2;
END;
END DivBy2;</langsyntaxhighlight>
 
=={{header|Monte}}==
 
<syntaxhighlight lang="monte">
<lang Monte>
var i := 1024
while (i > 0):
traceln(i)
i //= 2
</syntaxhighlight>
</lang>
 
=={{header|MOO}}==
<langsyntaxhighlight lang="moo">i = 1024;
while (i > 0)
player:tell(i);
i /= 2;
endwhile</langsyntaxhighlight>
 
=={{header|Morfa}}==
<syntaxhighlight lang="morfa">
import morfa.io.print;
 
var i = 1024;
while(i > 0)
{
println(i);
i /= 2;
}
</syntaxhighlight>
 
=={{header|Nanoquery}}==
<syntaxhighlight lang="nanoquery">$n = 1024
while ($n > 0)
println $n
$n = $n/2
end while</syntaxhighlight>
 
=={{header|Neko}}==
<syntaxhighlight lang="neko">
var i = 1024
 
while(i > 0) {
$print(i + "\n");
i = $idiv(i, 2)
}
</syntaxhighlight>
 
=={{header|Nemerle}}==
<langsyntaxhighlight Nemerlelang="nemerle">mutable x = 1024;
while (x > 0)
{
WriteLine($"$x");
x /= 2;
}</langsyntaxhighlight>
Or, with immutable types, after Haskell:
<langsyntaxhighlight Nemerlelang="nemerle">// within another function, eg Main()
def loop(n : int) : void
{
Line 891 ⟶ 2,528:
}
loop(1024)</langsyntaxhighlight>
 
=={{header|Neko}}==
<lang Neko>
var a = 5;
var i = 0;
 
while(i < a) {
i = i + 1;
}
</lang>
 
=={{header|NetRexx}}==
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref savelog symbols nobinary
 
Line 914 ⟶ 2,541:
say x_.right(6)
x_ = x_ % 2 -- integer division
end</langsyntaxhighlight>
 
=={{header|NimrodNewLISP}}==
<syntaxhighlight lang nimrod="newlisp">var(let n: int =(i 1024)
(while (> i 0)
(println i)
(setq i (/ i 2))))</syntaxhighlight>
 
=={{header|Nim}}==
<syntaxhighlight lang="nim">var n: int = 1024
while n > 0:
echo(n)
n = n div 2</langsyntaxhighlight>
 
=={{header|Oberon-2}}==
The usual module code and imports are ommited.
<langsyntaxhighlight lang="oberon2">PROCEDURE DivBy2*();
VAR i: INTEGER;
BEGIN
Line 933 ⟶ 2,566:
i := i DIV 2;
END;
END DivBy2;</langsyntaxhighlight>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">i := 1024;
while(i > 0) {
i->PrintLine();
i /= 2;
};</langsyntaxhighlight>
 
=={{header|ObjectIcon}}==
 
An important thing here is the test for termination is a succeed-or-fail operation, rather than a boolean expression. No boolean value is written to the output; rather, the whole statement ''fails'' when '''n''' reaches zero. The expression '''0 < n''' either returns '''n''' or ''fails''.
 
<syntaxhighlight lang="objecticon">import io
 
procedure main()
local n
n := 1024
while n := write(0 < n) / 2
end</syntaxhighlight>
 
{{out}}
$ oit -s loops_while-oi.icn && ./loops_while-oi
<pre>1024
512
256
128
64
32
16
8
4
2
1</pre>
 
The following also works, and shows a way to avoid having to code the method of writing the output into the loop itself.
<syntaxhighlight lang="objecticon">import io
 
procedure main()
local coexpression
coexpression := create generator(1024)
while write(@coexpression)
end
 
procedure generator(n)
while 0 < n do { suspend n; n /:= 2 }
end</syntaxhighlight>
 
To show what I mean, let’s do some (merely illustrative) loop-unrolling where the output gets written.
<syntaxhighlight lang="objecticon">import io
 
procedure main()
local coexpression
coexpression := create generator(1024)
write(@coexpression) &
write(@coexpression) &
write(@coexpression) &
write(@coexpression)&
while (write(@coexpression) &
write(@coexpression) &
write(@coexpression) &
write(@coexpression))
end
 
procedure generator(n)
while 0 < n do { suspend n; n /:= 2 }
end</syntaxhighlight>
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">let n = ref 1024;;
while !n > 0 do
Printf.printf "%d\n" !n;
n := !n / 2
done;;</langsyntaxhighlight>
 
But it is more common to write it in a tail-recursive functional style:
<langsyntaxhighlight lang="ocaml">let rec loop n =
if n > 0 then begin
Printf.printf "%d\n" n;
loop (n / 2)
end
in loop 1024</langsyntaxhighlight>
 
=={{header|Octave}}==
<langsyntaxhighlight lang="octave">i = 1024;
while (i > 0)
disp(i)
i = floor(i/2);
endwhile</langsyntaxhighlight>
 
The usage of the type int32 is not convenient, since the math is done floating point, then rounding to integer, so that 1/2 will be always 1 and never 0.
 
=={{header|Odin}}==
 
Odin only has one loop type: for
 
<syntaxhighlight lang="odin">
package main
 
import "core:fmt"
 
main :: proc() {
for i := 1024 ; i > 0 ; i /= 2 {
fmt.println(i)
}
}
</syntaxhighlight>
 
=={{header|Oforth}}==
 
<syntaxhighlight lang="oforth">1024 while ( dup ) [ dup println 2 / ]</syntaxhighlight>
 
=={{header|OOC}}==
<syntaxhighlight lang="ooc">
main: func {
value := 1024
while (value > 0) {
value toString() println()
value /= 2
}
}
</syntaxhighlight>
 
=={{header|Oz}}==
Oz' for-loop can be used in a C-like manner:
<langsyntaxhighlight lang="oz">for I in 1024; I>0; I div 2 do
{Show I}
end</langsyntaxhighlight>
 
Alternatively, we can use the <code>while</code> feature of the for-loop with a mutable variable:
<langsyntaxhighlight lang="oz">declare
I = {NewCell 1024}
in
Line 979 ⟶ 2,702:
{Show @I}
I := @I div 2
end</langsyntaxhighlight>
 
=={{header|Panda}}==
Panda doesn't have explicit loops, instead we solve it by using the transitive closure operator. It applies a function to each successive value, each unique value is outputted. Our function halves, we make sure that the result is greater than 0 and add newline.
<syntaxhighlight lang="panda">fun half(a) type integer->integer a.divide(2)
1024.trans(func:half).gt(0) nl
</syntaxhighlight>
 
=={{header|Panoramic}}==
<langsyntaxhighlight Panoramiclang="panoramic">dim x%:rem an integer
 
x%=1024
Line 994 ⟶ 2,724:
rem output starts with 1024 and ends with 1.
 
terminate</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">n=1024;
while(n,
print(n);
n/=2
);</langsyntaxhighlight>
 
=={{header|Pascal}}==
<langsyntaxhighlight lang="pascal">program divby2(output);
 
var
Line 1,016 ⟶ 2,746:
i := i div 2
end
end.</langsyntaxhighlight>
 
=={{header|PeopleCode}}==
<syntaxhighlight lang="peoplecode">
Local string &CRLF;
Local number &LoopNumber;
&LoopNumber = 1024;
&CRLF = Char(10) | Char(13);
 
While &LoopNumber > 0;
WinMessage(&LoopNumber | &CRLF);
&LoopNumber = &LoopNumber / 2;
End-While;
</syntaxhighlight>
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">my $n = 1024;
while ($n) {
print "$n\n";
$n = int $n / 2;
}</langsyntaxhighlight>
 
or written as a for-loop and using the bit-shift operator
 
<syntaxhighlight lang="perl">for(my $n = 1024; $n > 0; $n >>= 1){
print "$n\n";
}</syntaxhighlight>
 
<code>until (''condition'')</code> is equivalent to <code>while (not ''condition'')</code>.
 
<langsyntaxhighlight lang="perl">my $n = 1024;
until ($n <== 0) {
print "$n\n";
$n = int $n / 2;
}</langsyntaxhighlight>
 
=={{header|Perl 6Phix}}==
<!--<syntaxhighlight lang="phix">-->
<span style="color: #004080;">integer</span> <span style="color: #000000;">i</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1024</span>
<span style="color: #008080;">while</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">do</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">i</span>
<span style="color: #000000;">i</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (see note)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<!--</syntaxhighlight>-->
note: using i=i/2 would iterate over 1000 times until i is 4.94e-324 before the final division made it 0, if it didn't typecheck when it got set to 0.5
 
=={{header|Phixmonti}}==
Here is a straightforward translation of the task description:
<syntaxhighlight lang="Phixmonti">/# Rosetta Code problem: https://rosettacode.org/wiki/Loops/While
<lang perl6>my $n = 1024; while $n > 0 { say $n; $n div= 2 }</lang>
by Galileo, 11/2022 #/
 
include ..\Utilitys.pmt
The same thing with a C-style loop and a bitwise shift operator:
<lang perl6>loop (my $n = 1024; $n > 0; $n +>= 1) { say $n }</lang>
 
1024 dup while dup ? 2 / int dup endwhile</syntaxhighlight>
And here's how you'd <em>really</em> write it, using a sequence operator that intuits the division for you:
{{out}}
<pre>1024
512
256
128
64
32
16
8
4
2
1
 
=== Press any key to exit ===</pre>
<lang perl6>.say for 1024, 512, 256 ... 1</lang>
 
=={{header|PHL}}==
 
<langsyntaxhighlight lang="phl">var i = 1024;
while (i > 0) {
printf("%i\n", i);
i = i/2;
}</langsyntaxhighlight>
 
=={{header|PHP}}==
<langsyntaxhighlight lang="php">$i = 1024;
while ($i > 0) {
echo "$i\n";
$i >>= 1;
}</langsyntaxhighlight>
 
=={{header|Picat}}==
While loop
<syntaxhighlight lang="picat">go =>
N = 1024,
while (N > 0)
println(N),
N := N // 2
end.</syntaxhighlight>
 
Recursion
{{trans|Prolog}}
<syntaxhighlight lang="picat">go2 =>
while_loop(1024).
 
while_loop(0) => true.
while_loop(N) =>
println(N),
while_loop(N//2).</syntaxhighlight>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(let N 1024
(while (gt0 N)
(println N)
(setq N (/ N 2)) ) )</langsyntaxhighlight>
 
=={{header|Pike}}==
<langsyntaxhighlight lang="pike">int main(){
int i = 1024;
while(i > 0){
Line 1,073 ⟶ 2,862:
i = i / 2;
}
}</langsyntaxhighlight>
 
=={{header|PL/0}}==
<syntaxhighlight lang="pascal">
var i;
begin
i := 1024;
while i > 0 do
begin
! i;
i := i / 2
end;
end.
</syntaxhighlight>
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|PL/I}}==
<langsyntaxhighlight PLlang="pl/Ii">declare i fixed binary initial (1024);
 
do while (i>0);
put skip list (i);
i = i / 2;
end;</langsyntaxhighlight>
 
=={{header|PL/SQL}}==
{{works with|Oracle}}
<syntaxhighlight lang="plsql">
set serveroutput on
declare
n number := 1024;
begin
while n > 0 loop
dbms_output.put_line(n);
n := trunc(n / 2);
end loop;
end;
/
</syntaxhighlight>
 
=={{header|Plain English}}==
<syntaxhighlight lang="plainenglish">To run:
Start up.
Show the halvings of 1024.
Wait for the escape key.
Shut down.
 
To show the halvings of a number:
If the number is 0, exit.
Convert the number to a string.
Write the string to the console.
Divide the number by 2.
Repeat.</syntaxhighlight>
 
=={{header|Pop11}}==
<langsyntaxhighlight lang="pop11">lvars i = 1024;
while i > 0 do
printf(i, '%p\n');
i div 2 -> i;
endwhile;</langsyntaxhighlight>
 
=={{header|PostScript}}==
PostScript has no real <code>while</code> loop, but it can easily be created with an endless loop and a check at the beginning:
but it can easily be created with an endless loop and a check at the beginning:
<lang postscript>1024
<syntaxhighlight lang="postscript">1024
{
dup 0 le % check whether still greater than 0
Line 1,100 ⟶ 2,946:
2 idiv % divide by two
}
loop</langsyntaxhighlight>
 
=={{header|PowerShell}}==
<langsyntaxhighlight lang="powershell">[int]$i = 1024
while ($i -gt 0) {
$i
$i /= 2
}</langsyntaxhighlight>
 
=={{header|Prolog}}==
<langsyntaxhighlight lang="prolog">while(0) :- !.
while(X) :-
while(X) :- X>0,write(X), nl, X1 is X // 2, while(X1).</lang>
writeln(X),
X1 is X // 2,
while(X1).</syntaxhighlight>
 
Start the calculation at a top-level like this:
=={{header|PureBasic}}==
<lang PureBasic>If OpenConsole()
x.i = 1024
While x > 0
PrintN(Str(x))
x / 2
Wend
 
<syntaxhighlight lang="prolog">?- while(1024).</syntaxhighlight>
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit")
Input()
CloseConsole()
EndIf</lang>
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">n = 1024
while n > 0:
print n
n //= 2</langsyntaxhighlight>
 
=={{header|Quackery}}==
<syntaxhighlight lang="quackery">1024
[ dup 0 > while
dup echo cr 2 /
again ]
drop</syntaxhighlight>
 
{{Out}}
 
<pre>1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r">i <- 1024L
while(i > 0)
{
print(i)
i <- i %/% 2
}</langsyntaxhighlight>
 
=={{header|REBOL}}==
<lang REBOL>REBOL [
Title: "Loop/While"
Author: oofoe
Date: 2009-12-19
URL: http://rosettacode.org/wiki/Loop/While
]
 
value: 1024
while [value > 0][
print value
value: to-integer value / 2
]</lang>
 
=={{header|Racket}}==
===Loop/When===
<langsyntaxhighlight lang="racket">#lang racket
(let loop ([n 1024])
(when (positive? n)
(displayln n)
(loop (quotient n 2))))</langsyntaxhighlight>
 
===Macro===
<langsyntaxhighlight lang="racket">#lang racket
(define-syntax-rule (while condition body ...)
(let loop ()
Line 1,170 ⟶ 3,019:
(loop))))
 
(define n 01024)
(while (<positive? n 10)
(displayln n)
(set! n (add1sub1 n)))</langsyntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
 
Here is a straightforward translation of the task description:
<syntaxhighlight lang="raku" line>my $n = 1024; while $n > 0 { say $n; $n div= 2 }</syntaxhighlight>
 
The same thing with a C-style loop and a bitwise shift operator:
<syntaxhighlight lang="raku" line>loop (my $n = 1024; $n > 0; $n +>= 1) { say $n }</syntaxhighlight>
 
And here's how you'd <em>really</em> write it, using a sequence operator that intuits the division for you:
 
<syntaxhighlight lang="raku" line>.say for 1024, 512, 256 ... 1</syntaxhighlight>
 
=={{header|REBOL}}==
<syntaxhighlight lang="rebol">REBOL [
Title: "Loop/While"
URL: http://rosettacode.org/wiki/Loop/While
]
 
value: 1024
while [value > 0][
print value
value: to-integer value / 2
]</syntaxhighlight>
 
 
=={{header|ReScript}}==
<syntaxhighlight lang="rescript">let n = ref(1024)
while n.contents > 0 {
Js.log(n.contents)
n := n.contents / 2
}</syntaxhighlight>
 
=={{header|Retro}}==
<langsyntaxhighlight Retrolang="retro">1024 [ cr &putn sip 2 / dup ] while</langsyntaxhighlight>
 
=={{header|REXX}}==
===version 1, simple===
<langsyntaxhighlight lang="rexx">/*REXX program demonstrates a DO WHILE with index reduction construct.*/
j=1024 /*define the initial value of J.*/
do while j>0 /*test if made at the top of DO.*/
Line 1,186 ⟶ 3,068:
j=j%2 /*in REXX, % is integer division.*/
end
/*stick a fork in it, we're done.*/</langsyntaxhighlight>
{{out}}
'''output'''
<pre>
<pre style="overflow:scroll">
1024
512
Line 1,207 ⟶ 3,089:
::::: '''DO WHILE x\==0'''
but that wouldn't be compliant with the wording of the task.
<langsyntaxhighlight lang="rexx">/*REXX program demonstrates a DO WHILE with index reduction construct.*/
x=1024 /*define the initial value of X.*/
do while x>0 /*test if made at the top of DO.*/
Line 1,213 ⟶ 3,095:
x=x%2 /*in REXX, % is integer division.*/
end
/*stick a fork in it, we're done.*/</langsyntaxhighlight>
{{out}}
'''output'''
<pre>
<pre style="overflow:scroll">
1024
512
Line 1,230 ⟶ 3,112:
 
===version 3, faster WHILE comparison===
<langsyntaxhighlight lang="rexx">/*REXX program demonstrates a DO WHILE with index reduction construct.*/
x=1024 /*define the initial value of X.*/
do while x>>0 /*this is an exact comparison. */
Line 1,236 ⟶ 3,118:
x=x%2 /*in REXX, % is integer division.*/
end
/*stick a fork in it, we're done.*/</langsyntaxhighlight>
'''output''' is the same as version 2.
<br><br>
 
===version 4, index reduction===
<langsyntaxhighlight lang="rexx">/*REXX program demonstrates a DO WHILE with index reduction construct.*/
/* [↓] note: BY defaults to 1*/
do j=1024 by 0 while j>>0 /*this is an exact comparison. */
Line 1,247 ⟶ 3,129:
j=j%2 /*in REXX, % is integer division.*/
end
/*stick a fork in it, we're done.*/</langsyntaxhighlight>
'''output''' is the same as version 2.
<br><br>
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
i = 1024
while i > 0
see i + nl
i = floor(i / 2)
end
</syntaxhighlight>
 
=={{header|Rockstar}}==
<syntaxhighlight lang="rockstar">The sky is a television on fire.
The floor is ornamental.
The table is hydrochloric.
While the sky is higher than the floor,
Shout the sky.
Put the sky over the table into the sky.
(Rockstar is known for doing that JavaScript quirk, since all numbers are floats, but due to it having the same limits as JavaScript and the most popular interpreter being JS-based, the loop is finite, yet you don't get the result you would get in something like Python.)</syntaxhighlight>
=={{header|RPL}}==
≪ 1024
'''WHILE''' DUP '''REPEAT'''
DUP 1 DISP
2 /
'''END'''
DROP
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">i = 1024
while i > 0 do
puts i
i /= 2
end</langsyntaxhighlight>
The above can be written in one statement (using the return value of the Kernel#puts method: nil is false), but the readability suffers:
<langsyntaxhighlight lang="ruby">puts i = 1024
puts i or i /= 2 while i > 0</langsyntaxhighlight>
 
<code>until ''condition''</code> is equivalent to <code>while not ''condition''</code>.
 
<langsyntaxhighlight lang="ruby">i = 1024
until i <= 0 do
puts i
i /= 2
end</langsyntaxhighlight>
 
=={{header|Run BASIC}}==
=={{header|Rust}}==
<lang runbasic>i = 1024
<syntaxhighlight lang="rust">fn main() {
while i > 0
let mut n: i32 = 1024;
print i
i =while int(in /> 2)0 {
println!("{}", n);
wend
n /= 2;
end</lang>
}
}</syntaxhighlight>
 
=={{header|SAS}}==
<langsyntaxhighlight lang="sas">data _null_;
n=1024;
do while(n>0);
Line 1,283 ⟶ 3,193:
n=int(n/2);
end;
run;</langsyntaxhighlight>
 
=={{header|Sather}}==
<langsyntaxhighlight lang="sather">class MAIN is
main is
i ::= 1024;
Line 1,294 ⟶ 3,204:
end;
end;
end;</langsyntaxhighlight>
 
=={{header|Scala}}==
[[Category:Scala Implementations]]
{{libheader|Scala}}
===Imperative===
<langsyntaxhighlight lang="scala">var i = 1024
while (i > 0) {
println(i)
i /= 2
}</langsyntaxhighlight>
 
===Tail recursive===
<langsyntaxhighlight lang="scala"> @tailrec
def loop(iter: Int) {
if ((iter > 0)) {
println(iter)
loop(iter / 2)
}
}
loop(1024)</langsyntaxhighlight>
 
===Iterator===
<langsyntaxhighlight lang="scala"> def loop = new Iterator[Int] {
var i = 1024
def hasNext = i > 0
def next(): Int = { val tmp = i; i = i / 2; tmp }
}
loop.foreach(println(_))</langsyntaxhighlight>
 
===Stream===
Finite stream (1024..0) filtered by takeWhile (1024..1).
<langsyntaxhighlight lang="scala"> def loop(i: Int): Stream[Int] = i #:: (if (i > 0) loop(i / 2) else Stream.empty)
loop(1024).takeWhile(_ > 0).foreach(println(_))</langsyntaxhighlight>
 
=={{header|Scheme}}==
<langsyntaxhighlight lang="scheme">(do ((n 1024 (quotient n 2)))
((<= n 0))
(display n)
(newline))</langsyntaxhighlight>
 
=={{header|Scilab}}==
{{works with|Scilab|5.5.1}}
<syntaxhighlight lang="text">i=1024
while i>0
printf("%4d\n",i)
i=int(i/2)
end</syntaxhighlight>
{{out}}
<pre>1024
512
256
128
64
32
16
8
4
2
1</pre>
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const proc: main is func
Line 1,344 ⟶ 3,275:
i := i div 2
end while;
end func;</langsyntaxhighlight>
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|SenseTalk}}==
<syntaxhighlight lang="sensetalk">put 1024 into x
log x
Repeat until x = 1
divide x by 2
log x
End repeat</syntaxhighlight>
 
=={{header|SETL}}==
<syntaxhighlight lang="ada">n := 1024;
while n > 0 loop
print( n );
n := n div 2;
end loop;</syntaxhighlight>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">var i = 1024;
while (i > 0) {
say i;
i.div!( //= 2).int!;
}</langsyntaxhighlight>
 
=={{header|Simula}}==
{{works with|SIMULA-67}}
<syntaxhighlight lang="simula">begin
integer i;
i:=1024;
while i>0 do
begin
outint(i,5);
i:=i//2-1
end
end</syntaxhighlight>
{{out}}
<pre>
 1024  511  254  126   62   30   14    6    2 
</pre>
 
=={{header|Slate}}==
<langsyntaxhighlight lang="slate">#n := 1024.
[n isPositive] whileTrue:
[inform: number printString.
n := n // 2]</langsyntaxhighlight>
 
=={{header|Smalltalk}}==
The Block (aka lambda closure) class provides a number of loop messages; with test at begin, test at end and with exit (break).
<lang smalltalk>number := 1024.
 
<syntaxhighlight lang="smalltalk ">[s atEnd] whileFalse: [s next. ...].
[foo notNil] whileTrue: [s next. ...].
[...] doWhile: [ ... someBooleanExpression ].
[...] doUntil: [ ... someBooleanExpression ].
[:exit | ... cold ifTrue:[exit value]. ...] loopWithExit</syntaxhighlight>
 
Examples:
<syntaxhighlight lang="smalltalk">number := 1024.
[ number > 0 ] whileTrue:
[ Transcript print: number; nl.
number := number // 2 ]</langsyntaxhighlight>
 
<langsyntaxhighlight lang="smalltalk">number := 1024.
[ number <= 0 ] whileFalse:
[ Transcript print: number; nl.
number := number // 2 ]</langsyntaxhighlight>
 
=={{header|Sparkling}}==
<syntaxhighlight lang="sparkling">var i = 1024;
while i > 0 {
print(i);
i /= 2;
}</syntaxhighlight>
 
=={{header|Spin}}==
{{works with|BST/BSTC}}
{{works with|FastSpin/FlexSpin}}
{{works with|HomeSpun}}
{{works with|OpenSpin}}
<syntaxhighlight lang="spin">con
_clkmode = xtal1 + pll16x
_clkfreq = 80_000_000
 
obj
ser : "FullDuplexSerial.spin"
 
pub main | n
ser.start(31, 30, 0, 115200)
 
n := 1024
repeat while n > 0
ser.dec(n)
ser.tx(32)
n /= 2
 
waitcnt(_clkfreq + cnt)
ser.stop
cogstop(0)</syntaxhighlight>
{{out}}
<pre>
1024 512 256 128 64 32 16 8 4 2 1
</pre>
 
=={{header|SPL}}==
<syntaxhighlight lang="spl">n = 1024
>
#.output(n)
n /= 2
< n!<1</syntaxhighlight>
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|SQL PL}}==
{{works with|Db2 LUW}} version 9.7 or higher.
With SQL PL:
<syntaxhighlight lang="sql pl">
--#SET TERMINATOR @
 
SET SERVEROUTPUT ON @
 
BEGIN
DECLARE I SMALLINT DEFAULT 1024;
 
Loop: WHILE (I > 0) DO
CALL DBMS_OUTPUT.PUT_LINE(I);
SET I = I / 2;
END WHILE Loop;
END @
</syntaxhighlight>
Output:
<pre>
db2 -td@
db2 => SET SERVEROUTPUT ON @
DB20000I The SET SERVEROUTPUT command completed successfully.
db2 => BEGIN
...
db2 (cont.) => END @
DB20000I The SQL command completed successfully.
 
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|Standard ML}}==
<langsyntaxhighlight lang="sml">val n = ref 1024;
while !n > 0 do (
print (Int.toString (!n) ^ "\n");
n := !n div 2
)</langsyntaxhighlight>
 
But it is more common to write it in a tail-recursive functional style:
<langsyntaxhighlight lang="sml">let
fun loop n =
if n > 0 then (
Line 1,386 ⟶ 3,468:
in
loop 1024
end</langsyntaxhighlight>
 
=={{header|Stata}}==
<syntaxhighlight lang="stata">local n=1024
while `n'>0 {
display `n'
local n=floor(`n'/2)
}</syntaxhighlight>
 
=={{header|Suneido}}==
<langsyntaxhighlight Suneidolang="suneido">i = 1024
while (i > 0)
{
Print(i)
i = (i / 2).Floor()
}</langsyntaxhighlight>
{{Out}}
<pre>1024
Line 1,407 ⟶ 3,496:
2
1</pre>
 
=={{header|Swift}}==
<syntaxhighlight lang="swift">var i = 1024
while i > 0 {
println(i)
i /= 2
}</syntaxhighlight>
 
=={{header|Tailspin}}==
In Tailspin you can loop by sending a value back to the matchers (by "-> #"). Depending on how you set that up, you create different loops.
<syntaxhighlight lang="tailspin">
1024 -> \(
<0~..> '$;$#10;' -> !OUT::write
$ ~/ 2 -> #
\) -> !VOID
</syntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">set i 1024
while {$i > 0} {
puts $i
set i [expr {$i / 2}]
}</langsyntaxhighlight>
 
=={{header|TI-89 BASICTeX}}==
 
<syntaxhighlight lang="tex">\newcount\rosetta
<lang ti89b>Local i
\rosetta=1024 → i
\loop
While i > 0
\the\rosetta\endgraf
Disp i
\divide\rosetta by 2
intDiv(i, 2) → i
\ifnum\rosetta > 0
EndWhile</lang>
\repeat
\end</syntaxhighlight>
 
=={{header|TorqueScript}}==
This has to make use of mFloor because torque has automatic type shuffling,
causing an infiniteloop.
<langsyntaxhighlight Torquelang="torque">%num = 1024;
while(%num > 0)
{
echo(%num);
%num = mFloor(%num / 2);
}</langsyntaxhighlight>
 
=={{header|Transact-SQL}}==
<syntaxhighlight lang="transact-sql">
DECLARE @i INT = 1024;
WHILE @i >0
BEGIN
PRINT @i;
SET @i = @i / 2;
END;
</syntaxhighlight>
 
=={{header|Trith}}==
<langsyntaxhighlight lang="trith">1024 [dup print 2 / floor] [dup 0 >] while drop</langsyntaxhighlight>
<langsyntaxhighlight lang="trith">1024 [dup print 1 shr] [dup 0 >] while drop</langsyntaxhighlight>
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">$$ MODE TUSCRIPT
i=1024
LOOP
Line 1,445 ⟶ 3,562:
i=i/2
IF (i==0) EXIT
ENDLOOP</langsyntaxhighlight>
{{Out}}
<pre>
Line 1,463 ⟶ 3,580:
=={{header|Unicon}}==
See [[#Icon|Icon]].
 
=={{header|Uniface}}==
 
<syntaxhighlight lang="uniface">variables
numeric I
endvariables
 
I = 1024
while (I > 0)
putmess I
I = (I/2)[trunc]
endwhile</syntaxhighlight>
 
=={{header|UNIX Shell}}==
{{works with|Bourne Again SHell}}
<langsyntaxhighlight lang="bash">x=1024
while [[ $x -gt 0 ]]; do
echo $x
x=$(( $x/2 ))
done</langsyntaxhighlight>
 
=={{header|UnixPipes}}==
<langsyntaxhighlight lang="bash">(echo 1024>p.res;tail -f p.res) | while read a ; do
test $a -gt 0 && (expr $a / 2 >> p.res ; echo $a) || exit 0
done</langsyntaxhighlight>
 
=={{header|Ursa}}==
<syntaxhighlight lang="ursa">decl int n
set n 1024
 
while (> n 0)
out n endl console
set n (int (/ n 2))
end while</syntaxhighlight>
 
=={{header|Ursala}}==
Unbounded iteration is expressed with the -> operator. An expression
An expression (p-> f) x, where p is a predicate and f is a function, evaluates to x,
evaluates to x, f(x), or f(f(x)), etc. as far as necessary to falsify p.
 
Printing an intermediate result on each iteration is a bigger problem
because side effects are awkward. Instead, the function g in this
Instead, the function g in this example iteratively constructs a list of results, which is displayed
which is displayed on termination.
 
The argument to g is the unit list <1024>. The predicate p is ~&h,
The predicate p is ~&h, the function that tests whether
the function that tests whether the head of a list is non-null
the head of a list is non-null (equivalent to non-zero). The iterated function f is that which conses
The iterated function f is that which conses the
the truncated half of the head of its argument with a copy of the
truncated half of the head of its argument with a copy of the whole argument.
whole argument. The main program takes care of list reversal and
The main program takes care of list reversal and formatting.
formatting.
<langsyntaxhighlight Ursalalang="ursala">#import nat
 
g = ~&h-> ^C/half@h ~&
Line 1,499 ⟶ 3,637:
#show+
 
main = %nP*=tx g <1024></langsyntaxhighlight>
{{Out}}
<pre>
Line 1,517 ⟶ 3,655:
The same output is produced by the following main program
using bit manipulation.
<langsyntaxhighlight Ursalalang="ursala">main = %nP*=tK33 1024</langsyntaxhighlight>
 
=={{header|V}}==
<langsyntaxhighlight lang="v">1024 [0 >] [
dup puts
2 / >int
] while</langsyntaxhighlight>
 
=={{header|Vala}}==
<syntaxhighlight lang="vala">int i = 1024;
while (i > 0) {
stdout.printf("%d\n", i);
i /= 2;
}</syntaxhighlight>
 
=={{header|Vedit macro language}}==
<langsyntaxhighlight lang="vedit">#1 = 1024
while (#1 > 0) {
Num_Type(#1)
#1 /= 2
}</langsyntaxhighlight>
or with for loop:
<langsyntaxhighlight lang="vedit">for (#1 = 1024; #1 > 0; #1 /= 2) {
Num_Type(#1)
}</langsyntaxhighlight>
 
=={{header|Verbexx}}==
<syntaxhighlight lang="verbexx">// Basic @LOOP while: verb
 
@LOOP init:{@VAR n = 1024} while:(n > 0) next:{n /= 2}
{
@SAY n;
};</syntaxhighlight>
 
 
=={{header|Verilog}}==
<syntaxhighlight lang="verilog">
module main;
integer i;
initial begin
i = 1024;
while( i > 0) begin
$display(i);
i = i / 2;
end
$finish ;
end
endmodule
</syntaxhighlight>
 
 
=={{header|Vim Script}}==
<langsyntaxhighlight lang="vim">let i = 1024
while i > 0
echo i
let i = i / 2
endwhile</langsyntaxhighlight>
 
=={{header|VisualV Basic .NET(Vlang)}}==
<syntaxhighlight lang="v (vlang)">fn main() {
<lang vbnet>Dim x = 1024
mut i := 1024
Do
for i > 0 {
Console.WriteLine(x)
x = x \ 2println(i)
i /= 2
Loop While x > 0</lang>
}
}</syntaxhighlight>
 
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|Wart}}==
<langsyntaxhighlight lang="wart">i <- 1024
while (i > 0)
prn i
i <- (int i/2)</langsyntaxhighlight>
 
=={{header|Whitespace}}==
<langsyntaxhighlight Whitespacelang="whitespace">
 
Line 1,573 ⟶ 3,762:
 
 
</syntaxhighlight>
</lang>
Pseudo-assembly equivalent:
<langsyntaxhighlight lang="asm">push 1024
 
0:
Line 1,582 ⟶ 3,771:
push 0 swap sub
jn 0
pop exit</langsyntaxhighlight>
 
=={{header|Wren}}==
<syntaxhighlight lang="wren">var i = 1024
while (i > 0) {
System.print(i)
i = (i / 2).floor
}</syntaxhighlight>
 
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
 
=={{header|X86 Assembly}}==
<syntaxhighlight lang="asm">
; NASM 64 bit X86-64 assembly on Linux
 
global main
extern printf
 
segment .data
 
printffmt db `%ld\n`,0
 
segment .text
 
main:
push rbp
mov rbp,rsp
; used rbx and r12 because printf preserves these values
mov rbx,1024 ; start with 1024
mov r12,2 ; load 2 as divisor
 
.toploop ; top of while loop
cmp rbx,0 ; compare to 0
jle .done ; exit 0 or less
lea rdi,[printffmt] ; print number in rsi
mov rsi,rbx ; mov to rsi as argument
call printf
 
; calculate n/2 and save
xor rdx,rdx ; clear rdx for division
mov rax,rbx ; mov number to rax for division
idiv r12 ; divide by 2
mov rbx,rax ; save n/2
 
jmp .toploop ; next loop
 
.done
xor rax,rax ; return code 0
leave ; fix stack
ret ; return
</syntaxhighlight>
 
=={{header|XLISP}}==
The specification calls for an integer value and for the loop to run <tt>WHILE</tt> that value is greater than zero. In a dynamically typed language like XLISP, variables cannot be declared as integer or real; but the same result is obtained by looping <tt>WHILE</tt> the value of the variable <i>i</i> is greater than or equal to one.
<syntaxhighlight lang="xlisp">(DEFINE I 1024)
 
(WHILE (>= I 1)
(PRINT I)
(DEFINE I (/ I 2)))</syntaxhighlight>
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">code CrLf=9, IntOut=11;
int I;
[I:= 1024;
Line 1,592 ⟶ 3,855:
I:= I>>1; \(same as I/2 for positive I)
];
]</langsyntaxhighlight>
 
=={{header|Z80 Assembly}}==
{{works with|CP/M 3.1|YAZE-AG-2.51.2 Z80 emulator}}
{{works with|ZSM4 macro assembler|YAZE-AG-2.51.2 Z80 emulator}}
Use the /S8 switch on the ZSM4 assembler for 8 significant characters for labels and names
<syntaxhighlight lang="z80">
;
; while loop, dividing 1024 repeatedly by 2, using Z80 assembly language
;
; Runs under CP/M 3.1 on YAZE-AG-2.51.2 Z80 emulator
; Assembled with zsm4 on same emulator/OS, uses macro capabilities of said assembler
; Created with vim under Windows
;
; Thanks to https://wikiti.brandonw.net for the idea for the conversion routine hl -> decimal ASCII
;
;
; 2023-05-19 Xorph
;
 
;
; Useful definitions
;
 
bdos equ 05h ; Call to CP/M BDOS function
strdel equ 6eh ; Set string delimiter
wrtstr equ 09h ; Write string to console
 
nul equ 00h ; ASCII control characters
cr equ 0dh
lf equ 0ah
 
cnull equ '0' ; ASCII character constants
 
;
; Macros for BDOS calls
;
 
setdel macro char ; Set string delimiter to char
ld c,strdel
ld e,char
call bdos
endm
 
print macro msg ; Output string to console
ld c,wrtstr
ld de,msg
call bdos
endm
 
newline macro ; Print newline
ld c,wrtstr
ld de,crlf
call bdos
endm
 
;
; =====================
; Start of main program
; =====================
;
 
cseg
 
setdel nul ; Set string delimiter to 00h
ld ix,value ; Register ix points to memory location of counter
 
while:
ld a,(ix) ; Z80 has no 16 bit compare, so we check the value byte by byte for 0
or a ; In contrast to other CPUs, loading a register does NOT set the flags
jr nz,docalc ; or-ing the accumulator with itself sets the flags and is faster than "cp 0"
ld a,(ix+1)
or a
jr z,endprog ; If both bytes are 0, end program - this jump could be optimized away
; and replaced with a direct "ret z", but we want to simulate a "real"
; while loop, so we continue (jump to) after the last loop statement
 
docalc:
ld hl,(value) ; Print the current value, followed by newline
ld iy,buffer ; Register iy points to memory location for current value as text for printout
call dispHL ; dispHL modifies iy, so it must be reset to the buffer on every iteration
 
print buffer
newline
 
srl (ix+1) ; Neither has the Z80 a 16 bit shift operation for dividing by 2...
rr (ix) ; Shift the MSB of value right and then rotate the LSB with carry to the right
 
jr while ; Next iteration
 
endprog:
ret ; Return to CP/M
 
;
; ===================
; End of main program
; ===================
;
 
;
; Helper routines - notice that the Z80 does not have a divide instruction
; Notice further that CP/M does not have any support for pretty-printing
; formatted numbers and stuff like that. So we have to do all this by hand...
;
 
;
; Converts the value (unsigned int) in register hl to its decimal representation
; Register iy has memory address of target for converted value
; String is terminated with nul character (\0)
;
 
dispHL:
ld b,1 ; Flag for leading '0'
irp x,<-10000,-1000,-100,-10,-1>
ld de,x ; Subtract powers of 10 and determine digit
call calcdig
endm
 
ld a,nul ; Terminate result string with nul
ld (iy+0),a
 
ret ; End of conversion routine
 
calcdig:
ld a,cnull-1 ; Determine the digit character
incrdig:
inc a ; Start with '0'
add hl,de ; As long as subtraction is possible, increment digit character
jr c,incrdig
 
sbc hl,de ; If negative, undo last subtraction and continue with remainder
cp cnull ; Check for leading '0', these are ignored
jr nz,adddig
bit 0,b ; Use bit instruction for check if flag set, register a contains digit
ret nz ; If '0' found and flag set, it is a leading '0' and we return
adddig:
ld b,0 ; Reset flag for leading '0', we are now outputting digits
ld (iy+0),a ; Store character in memory and set iy to next location
inc iy
 
ret ; End of conversion helper routine
 
;
; ================
; Data definitions
; ================
;
 
dseg
 
value: defw 1024d ; Starting value for loop, 16 bit little endian
crlf: defb cr,lf,nul ; Generic newline
buffer: defs 10 ; Buffer for conversion of number to text
 
</syntaxhighlight>
 
=={{header|zkl}}==
<lang zkl>n:=1024; while(n>0){println(n); n/=2;}</lang>
{{out}}
<pre>
E>whilelp
1024
512
Line 1,609 ⟶ 4,025:
2
1
 
</pre>
 
=={{header|Zig}}==
{{omit from|GUISS|No loops and we cannot read values}}
<syntaxhighlight lang="zig">
const std = @import("std");
 
pub fn main() void {
[[Category:Conditional loops]]
var i: u11 = 1024;
while (i > 0) : (i /= 2)
std.debug.print("{}\n", .{i});
}
</syntaxhighlight>
 
=={{header|zkl}}==
<syntaxhighlight lang="zkl">n:=1024; while(n>0){println(n); n/=2;}</syntaxhighlight>
{{out}}
<pre>
1024
512
256
128
64
32
16
8
4
2
1
</pre>
57

edits